@adminide-stack/yantra-mobile 12.0.105 → 12.0.106
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/features/messaging/BlockedContactsScreen.js +127 -0
- package/lib/features/messaging/BlockedContactsScreen.js.map +1 -0
- package/lib/features/messaging/ChatAttachments.js +4 -2
- package/lib/features/messaging/ChatAttachments.js.map +1 -1
- package/lib/features/messaging/ChatComponents.js +194 -10
- package/lib/features/messaging/ChatComponents.js.map +1 -1
- package/lib/features/messaging/ChatInfoScreen.js +173 -17
- package/lib/features/messaging/ChatInfoScreen.js.map +1 -1
- package/lib/features/messaging/ConversationListScreen.js +17 -1
- package/lib/features/messaging/ConversationListScreen.js.map +1 -1
- package/lib/features/messaging/MediaGalleryScreen.js +264 -0
- package/lib/features/messaging/MediaGalleryScreen.js.map +1 -0
- package/lib/features/messaging/NativeChatExperience.js +137 -18
- package/lib/features/messaging/NativeChatExperience.js.map +1 -1
- package/lib/features/messaging/NewGroupScreen.js +191 -0
- package/lib/features/messaging/NewGroupScreen.js.map +1 -0
- package/lib/features/messaging/PollComposer.js +137 -0
- package/lib/features/messaging/PollComposer.js.map +1 -0
- package/lib/features/messaging/PollVotesScreen.js +122 -0
- package/lib/features/messaging/PollVotesScreen.js.map +1 -0
- package/lib/features/messaging/ThreadScreen.js +180 -13
- package/lib/features/messaging/ThreadScreen.js.map +1 -1
- package/lib/features/messaging/chatLinks.js +39 -2
- package/lib/features/messaging/chatLinks.js.map +1 -1
- package/lib/features/messaging/chatModel.js +186 -19
- package/lib/features/messaging/chatModel.js.map +1 -1
- package/lib/features/messaging/chatOperations.js +111 -2
- package/lib/features/messaging/chatOperations.js.map +1 -1
- package/lib/features/messaging/nativeChatChannelQuery.js +7 -2
- package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -1
- package/lib/features/messaging/useChatData.js +248 -10
- package/lib/features/messaging/useChatData.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeChatExperience.js","sources":["../../../src/features/messaging/NativeChatExperience.tsx"],"sourcesContent":["/**\n * The chat remote's exposed root (`chat_native/Chat`).\n *\n * Owns its own navigation as local state - the remote must not import\n * @react-navigation, because a second copy of the navigator would not share the\n * host's container. Android hardware back is handled with RN's own BackHandler.\n *\n * Everything here is plain react-native (plus expo-image and\n * @expo/vector-icons, both host-shared singletons) - no gluestack, no\n * NativeWind, no Apollo - because a federated remote may only use what the host\n * shares, and every extra dependency is another way to fail to load on a device\n * in a way the simulator will not reproduce.\n */\nimport * as React from 'react';\nimport { ActivityIndicator, AppState, BackHandler, Platform, StyleSheet, View } from 'react-native';\nimport type { NativeChatExperienceProps } from './chatHost';\nimport { chatThemes, EmptyState } from './ChatComponents';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { ConversationListScreen } from './ConversationListScreen';\nimport { ContactsScreen } from './ContactsScreen';\nimport { ThreadScreen, type ChatSearchHit } from './ThreadScreen';\nimport { ChatInfoScreen } from './ChatInfoScreen';\nimport { NotificationSettingsScreen } from './NotificationSettingsScreen';\nimport { ForwardScreen } from './ForwardScreen';\nimport { StarredMessagesScreen } from './StarredMessagesScreen';\nimport { MessageInfoScreen } from './MessageInfoScreen';\nimport { forwardMessage, useConversations, useMarkRead, useReadWatermark, useThread, useTyping } from './useChatData';\nimport {\n SEARCH_MESSAGES_QUERY,\n SET_CHANNEL_MUTE_MUTATION,\n SET_DRAFT_MUTATION,\n VIEW_CHANNEL_MUTATION,\n YANTRA_CHAT_INVITER_QUERY,\n} from './chatOperations';\nimport {\n isMuted,\n messageStatus,\n muteLabel,\n muteUntilFor,\n toChatMessage,\n toEpoch,\n type ChatMessage,\n type ChatMuteOption,\n type WirePost,\n} from './chatModel';\nimport { buildChatInviteUrl, chatInviteMessage, whatsAppInviteUrl } from './chatInviteLink';\nimport { InviteSheet, type InviteChannel } from './InviteSheet';\nimport { createLinkPreviewLoader, openChatLink } from './linkPreview';\nimport { useContactMatches, type MatchedContact } from './useContactMatches';\n\n/** Used only when the host predates `chatInviteUrl`; the host supplies the per-environment domain. */\nconst DEFAULT_INVITE_WEB_BASE = 'https://yantra.app';\n\n/** The screens the remote routes between internally. */\nexport type ChatRoute =\n | 'list'\n | 'archived'\n | 'starred'\n | 'forward'\n | 'messageInfo'\n | 'thread'\n | 'contacts'\n | 'info'\n | 'notifications';\n\n/** A draft is saved this long after the last keystroke (and at once when the chat is left). */\nconst DRAFT_SAVE_DELAY_MS = 800;\n\n/** While a chat is open, the server hears \"read\" at most this often as messages land. */\nconst LIVE_READ_THROTTLE_MS = 2_000;\n\nfunction Shell({ theme, testID, children }: { theme: { bg: string }; testID?: string; children: React.ReactNode }) {\n return (\n <View testID={testID ?? 'chat-native'} style={[styles.fill, { backgroundColor: theme.bg }]}>\n {children}\n </View>\n );\n}\n\nexport function NativeChatExperience({\n viewer,\n sessionError,\n services,\n initialChannelId,\n initialChannelAt,\n initialPeer,\n onActiveChannelChange,\n onInternalRouteChange,\n testID,\n}: NativeChatExperienceProps) {\n const { isDark } = useAppTheme();\n const theme = isDark ? chatThemes.dark : chatThemes.light;\n\n const [route, setRoute] = React.useState<ChatRoute>(initialChannelId ? 'thread' : 'list');\n const [activeChannelId, setActiveChannelId] = React.useState<string | null>(initialChannelId ?? null);\n const [dismissedError, setDismissedError] = React.useState<string | null>(null);\n /** Where Notifications' back button returns to. */\n const [notificationsBack, setNotificationsBack] = React.useState<'list' | 'info'>('list');\n /** Unread when the open chat was opened, captured before the badge clears; places the unread band. */\n const [openedUnread, setOpenedUnread] = React.useState(0);\n const [muteBusy, setMuteBusy] = React.useState(false);\n const [infoError, setInfoError] = React.useState<string | null>(null);\n /** The message being forwarded (Forward screen). */\n const [forwarding, setForwarding] = React.useState<ChatMessage | null>(null);\n /** The message whose Message info is open. */\n const [infoMessage, setInfoMessage] = React.useState<ChatMessage | null>(null);\n /** Open the thread at this message (from Starred messages). */\n const [jumpTo, setJumpTo] = React.useState<string | null>(null);\n /** Where the list's back button / a thread's back goes: the main list or Archived. */\n const [listRoute, setListRoute] = React.useState<'list' | 'archived'>('list');\n /** Chat info and Forward sit on top of the open chat, so the transcript stays loaded underneath. */\n const threadChannelId =\n route === 'thread' || route === 'info' || route === 'forward' || route === 'messageInfo'\n ? activeChannelId\n : null;\n\n const conversations = useConversations(services, viewer, {\n syncListRealtime: route === 'list' || route === 'archived',\n });\n const { applyConversationMessage, applyConversationUpdate, markRead, setDraft } = conversations;\n\n // Drafts, WhatsApp-style: what the viewer leaves unsent stays with the chat (on the server,\n // so another device sees it too) and shows as \"Draft: …\" in the list.\n const pendingDraft = React.useRef<{ channelId: string; text: string } | null>(null);\n const draftTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const flushDraft = React.useCallback(() => {\n if (draftTimer.current) clearTimeout(draftTimer.current);\n draftTimer.current = null;\n const next = pendingDraft.current;\n pendingDraft.current = null;\n if (next) void services.gql.mutate(SET_DRAFT_MUTATION, { channelId: next.channelId, text: next.text });\n }, [services.gql]);\n const saveDraft = React.useCallback(\n (channelId: string, text: string) => {\n setDraft(channelId, text.trim());\n pendingDraft.current = { channelId, text };\n if (draftTimer.current) clearTimeout(draftTimer.current);\n draftTimer.current = setTimeout(flushDraft, DRAFT_SAVE_DELAY_MS);\n },\n [setDraft, flushDraft],\n );\n // Leaving the chat (or the whole screen) saves at once rather than dropping the last keystrokes.\n React.useEffect(() => {\n if (route !== 'thread') flushDraft();\n }, [route, flushDraft]);\n React.useEffect(() => flushDraft, [flushDraft]);\n const contactMatches = useContactMatches(services.gql, services.contacts, viewer, services.phone);\n const [busyContactId, setBusyContactId] = React.useState<string | null>(null);\n const [startChatError, setStartChatError] = React.useState<string | null>(null);\n // The viewer is reading as messages land, so the sender's ticks should turn blue now, not\n // when the viewer leaves the chat: tell the server, at most every couple of seconds.\n const liveReadAt = React.useRef(0);\n const liveReadTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const markReadLive = React.useCallback(\n (channelId: string) => {\n const wait = Math.max(0, liveReadAt.current + LIVE_READ_THROTTLE_MS - Date.now());\n if (liveReadTimer.current) return;\n liveReadTimer.current = setTimeout(() => {\n liveReadTimer.current = null;\n liveReadAt.current = Date.now();\n void services.gql.mutate(VIEW_CHANNEL_MUTATION, { id: channelId });\n }, wait);\n },\n [services.gql],\n );\n React.useEffect(\n () => () => {\n if (liveReadTimer.current) clearTimeout(liveReadTimer.current);\n },\n [],\n );\n const onThreadListUpdate = React.useCallback(\n (post: WirePost) => {\n if (!activeChannelId) return;\n applyConversationMessage(activeChannelId, post);\n // The viewer is looking at this thread, so a message arriving here is already read.\n markRead(activeChannelId);\n const author = post.author?.id ?? post.creator?.id;\n if (author && String(author) !== viewer?.userId) markReadLive(activeChannelId);\n },\n [activeChannelId, applyConversationMessage, markRead, markReadLive, viewer?.userId],\n );\n const onThreadUpdate = React.useCallback(\n (post: WirePost) => {\n if (activeChannelId) applyConversationUpdate(activeChannelId, post);\n },\n [activeChannelId, applyConversationUpdate],\n );\n const thread = useThread(services.gql, threadChannelId, viewer, {\n onConversationMessage: onThreadListUpdate,\n onConversationUpdate: onThreadUpdate,\n media: services.media,\n storage: services.storage,\n });\n const typing = useTyping(services.gql, route === 'thread' ? activeChannelId : null, viewer?.userId ?? null);\n\n // Clearing the badge is local-first; the mutation is fire-and-forget.\n useMarkRead(services.gql, route === 'thread' ? activeChannelId : null, markRead);\n\n // One loader for the whole messenger, so a link seen in two chats is read once.\n const linkPreviews = React.useMemo(() => createLinkPreviewLoader(services.gql), [services.gql]);\n const { link } = services;\n const onOpenLink = React.useMemo(() => {\n if (!link) return undefined;\n return (url: string) => {\n // openChatLink settles on its own (never rejects); the tap does not wait on it.\n openChatLink(url, { loader: linkPreviews, link }).catch(() => undefined);\n };\n }, [link, linkPreviews]);\n\n // Mark read again on LEAVING a thread, so messages that arrived while it was open\n // are not counted as unread by the server on the next list load.\n const threadOpenRef = React.useRef<string | null>(null);\n React.useEffect(() => {\n const open = route === 'thread' ? activeChannelId : null;\n const left = threadOpenRef.current;\n if (left && left !== open) void services.gql.mutate(VIEW_CHANNEL_MUTATION, { id: left });\n threadOpenRef.current = open;\n }, [route, activeChannelId, services.gql]);\n\n // The host suppresses a foreground push banner for the conversation already\n // on screen, so it has to be told every time that changes.\n React.useEffect(() => {\n onActiveChannelChange?.(route === 'thread' ? activeChannelId : null);\n }, [route, activeChannelId, onActiveChannelChange]);\n\n React.useEffect(() => {\n // Every screen but the list draws its own top bar, so the host hides its header for them.\n let internal: 'list' | 'thread' | 'contacts' = 'thread';\n if (route === 'list' || route === 'contacts') internal = route;\n onInternalRouteChange?.(internal);\n }, [route, onInternalRouteChange]);\n\n // The address book changes outside the app, so re-read it whenever the picker opens\n // and whenever the app returns to the foreground while the picker is showing.\n const refreshContactsRef = React.useRef(contactMatches.refresh);\n refreshContactsRef.current = contactMatches.refresh;\n const contactsGranted = contactMatches.permission === 'granted';\n React.useEffect(() => {\n if (route !== 'contacts' || !contactsGranted) return undefined;\n void refreshContactsRef.current();\n const sub = AppState.addEventListener('change', (state) => {\n if (state === 'active') void refreshContactsRef.current();\n });\n return () => sub.remove();\n }, [route, contactsGranted]);\n\n const activeConversation = React.useMemo(\n () => conversations.conversations.find((c) => c.id === activeChannelId) ?? null,\n [conversations.conversations, activeChannelId],\n );\n\n // Blue ticks: what the list knew when the chat opened, kept fresh while the viewer's\n // newest message is still waiting to be read.\n const listWatermark = activeConversation?.readWatermark ?? 0;\n const newestMine = React.useMemo(() => {\n for (let i = thread.messages.length - 1; i >= 0; i -= 1) {\n if (thread.messages[i].isMine) return thread.messages[i];\n }\n return null;\n }, [thread.messages]);\n const liveWatermark = useReadWatermark(\n services.gql,\n route === 'thread' ? activeChannelId : null,\n viewer?.userId ?? null,\n Boolean(\n newestMine &&\n newestMine.sendState !== 'sending' &&\n messageStatus(newestMine, listWatermark, activeConversation?.deliveredWatermark ?? 0) !== 'read',\n ),\n );\n const readWatermark = Math.max(listWatermark, liveWatermark.read);\n const deliveredWatermark = Math.max(activeConversation?.deliveredWatermark ?? 0, liveWatermark.delivered);\n\n // \"typing…\" in the header: the person in a one-to-one chat, or who it is in a group.\n const typingText = React.useMemo(() => {\n const ids = typing.typingUserIds;\n if (!ids.length) return '';\n if (activeConversation?.isDirect !== false) return 'typing…';\n if (ids.length > 1) return `${ids.length} people are typing…`;\n const name = thread.messages.find((m) => m.authorId === ids[0])?.authorName ?? 'Someone';\n return `${name.split(' ')[0]} is typing…`;\n }, [typing.typingUserIds, activeConversation?.isDirect, thread.messages]);\n\n const searchChat = React.useCallback(\n async (query: string): Promise<ChatSearchHit[]> => {\n if (!activeChannelId || !viewer?.userId) return [];\n const res = await services.gql.query<{ searchMessages?: { data?: (WirePost | null)[] | null } | null }>(\n SEARCH_MESSAGES_QUERY,\n { query, channelId: activeChannelId, limit: 50, skip: 0 },\n { fetchPolicy: 'network-only' },\n );\n return (res.data?.searchMessages?.data ?? [])\n .filter((p): p is WirePost => Boolean(p?.id && !p.deletedAt))\n .map((post) => {\n const m = toChatMessage(post, viewer.userId);\n return {\n id: m.id,\n body: m.body,\n createdAt: m.createdAt,\n authorName: m.isMine ? 'You' : m.authorName,\n };\n });\n },\n [activeChannelId, services.gql, viewer?.userId],\n );\n\n const sendForward = React.useCallback(\n async (channelIds: string[]): Promise<string[]> => {\n if (!forwarding) return [];\n const { sent, posts } = await forwardMessage(services.gql, forwarding.body, channelIds);\n posts.forEach(({ channelId, post }) => applyConversationMessage(channelId, post));\n if (sent.length === channelIds.length) {\n services.haptics?.impact('light');\n setForwarding(null);\n setRoute('thread');\n }\n return sent;\n },\n [forwarding, services.gql, services.haptics, applyConversationMessage],\n );\n\n const setMute = React.useCallback(\n async (option: ChatMuteOption | null) => {\n const id = activeChannelId;\n if (!id || muteBusy) return;\n const previous = conversations.conversations.find((c) => c.id === id)?.mutedUntil ?? 0;\n const until = option ? muteUntilFor(option, Date.now()) : null;\n setMuteBusy(true);\n setInfoError(null);\n conversations.setMutedUntil(id, until ? toEpoch(until) : 0);\n const res = await services.gql.mutate<{ setChannelMute?: boolean | null }>(SET_CHANNEL_MUTE_MUTATION, {\n channelId: id,\n mutedUntil: until,\n });\n setMuteBusy(false);\n if (res.errors?.length || !res.data?.setChannelMute) {\n conversations.setMutedUntil(id, previous);\n setInfoError(\n option\n ? 'Couldn’t mute this chat. Please try again.'\n : 'Couldn’t unmute this chat. Please try again.',\n );\n }\n },\n [activeChannelId, muteBusy, conversations, services.gql],\n );\n\n // Android back pops the internal stack before the host's navigator sees it.\n React.useEffect(() => {\n if (Platform.OS !== 'android') return undefined;\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n if (route === 'list') return false;\n if (route === 'info' || route === 'forward' || route === 'messageInfo') setRoute('thread');\n else if (route === 'notifications') setRoute(notificationsBack === 'info' ? 'info' : 'list');\n else if (route === 'thread') setRoute(listRoute);\n else setRoute('list');\n return true;\n });\n return () => sub.remove();\n }, [route, notificationsBack, listRoute]);\n\n const conversationsRef = React.useRef(conversations.conversations);\n conversationsRef.current = conversations.conversations;\n const openThread = React.useCallback((id: string, messageId?: string) => {\n setOpenedUnread(conversationsRef.current.find((c) => c.id === id)?.unreadCount ?? 0);\n setInfoError(null);\n setJumpTo(messageId ?? null);\n setActiveChannelId(id);\n setRoute('thread');\n }, []);\n\n // A notification tapped while Chats is already open: go to that conversation.\n React.useEffect(() => {\n if (initialChannelId && initialChannelAt) openThread(initialChannelId);\n }, [initialChannelId, initialChannelAt, openThread]);\n\n /**\n * Open (or reuse) the conversation with a matched contact. createDirectChannel\n * is idempotent server-side, so tapping someone you already talk to lands in\n * the existing thread rather than making a second one.\n */\n const startChatWith = React.useCallback(\n async (contact: MatchedContact) => {\n if (!contact.match || busyContactId) return;\n setBusyContactId(contact.id);\n setStartChatError(null);\n try {\n const id = await conversations.openDirect(contact.match.userId, contact.match.displayName);\n if (id) openThread(id);\n else setStartChatError('Could not start this conversation. Please try again.');\n } finally {\n setBusyContactId(null);\n }\n },\n [conversations, openThread, busyContactId],\n );\n\n // Opened from a chat invite link: go straight into the conversation with the inviter\n // (createDirectChannel is idempotent, so reopening an old invite lands in the same thread).\n // The link is editable by anyone, so the server has to vouch for the inviter first, and\n // its name is used - never the one in the link.\n // Tracks the invite object, not the user: every tap on a link arrives as a new object,\n // so reopening a link retries, while re-renders of the same one do not.\n const openedPeer = React.useRef<typeof initialPeer | null>(null);\n const [inviteNotice, setInviteNotice] = React.useState<string | null>(null);\n const { openDirect } = conversations;\n React.useEffect(() => {\n const peer = initialPeer;\n if (!peer?.userId || !viewer?.userId || peer.userId === viewer.userId) return;\n if (openedPeer.current === peer) return;\n openedPeer.current = peer;\n void (async () => {\n const res = await services.gql.query<{\n yantraChatInviter?: { userId: string; displayName: string } | null;\n }>(YANTRA_CHAT_INVITER_QUERY, { userId: peer.userId }, { fetchPolicy: 'network-only' });\n const inviter = res.data?.yantraChatInviter;\n if (!inviter) {\n setInviteNotice(\n res.errors?.length\n ? 'Could not open this invite. Check your connection and open the link again.'\n : 'This invite link is not valid anymore. Ask for a new one.',\n );\n return;\n }\n const id = await openDirect(inviter.userId, inviter.displayName);\n if (id) openThread(id);\n else setInviteNotice(`Could not start a conversation with ${inviter.displayName}. Please try again.`);\n })();\n }, [initialPeer, viewer?.userId, services.gql, openDirect, openThread]);\n\n /**\n * Invite someone who is not here yet: tapping Invite opens the invite sheet (Messages,\n * WhatsApp, copy link, share sheet) and the chosen app opens with the invite prefilled.\n * Nothing is sent without the person tapping Send there.\n *\n * The link names the inviter (so the app can open this conversation on arrival) and\n * carries no phone numbers.\n */\n const [inviteTarget, setInviteTarget] = React.useState<MatchedContact | null>(null);\n const [inviteSheetOpen, setInviteSheetOpen] = React.useState(false);\n\n const inviteContact = React.useCallback(\n (contact: MatchedContact) => {\n if (!services.link || !viewer?.userId) return;\n setInviteTarget(contact);\n setInviteSheetOpen(true);\n },\n [services.link, viewer?.userId],\n );\n\n const inviteMessage = React.useMemo(() => {\n if (!viewer?.userId) return '';\n const invite = { inviterId: viewer.userId, inviterName: viewer.displayName ?? null };\n const url = services.phone?.chatInviteUrl?.(invite) ?? buildChatInviteUrl(DEFAULT_INVITE_WEB_BASE, invite);\n return chatInviteMessage(viewer.displayName, url);\n }, [services.phone, viewer?.userId, viewer?.displayName]);\n\n const sendInvite = React.useCallback(\n async (channel: Exclude<InviteChannel, 'copy'>) => {\n const { link } = services;\n const contact = inviteTarget;\n if (!link || !contact || !inviteMessage) return;\n if (channel === 'whatsapp') {\n const url = whatsAppInviteUrl(contact.e164[0], inviteMessage);\n if (url) {\n await link.openUrl(url);\n return;\n }\n }\n if (channel === 'sms') {\n // Saved numbers, not our E.164 guesses: the phone dials them in its own region.\n const smsTo = contact.rawNumbers?.length ? contact.rawNumbers.slice(0, 1) : contact.e164.slice(0, 1);\n if (smsTo.length && (await link.composeSms(smsTo, inviteMessage)) === 'opened') return;\n }\n // 'share', and the fallback where Messages is unavailable (every simulator).\n await link.share(inviteMessage);\n },\n [services.link, inviteTarget, inviteMessage],\n );\n\n const activeTitle = React.useMemo(\n () => conversations.conversations.find((c) => c.id === activeChannelId)?.title ?? 'Chat',\n [conversations.conversations, activeChannelId],\n );\n\n if (sessionError) {\n return (\n <Shell theme={theme} testID={testID}>\n <EmptyState\n icon=\"alert-circle-outline\"\n title=\"Chat is unavailable\"\n detail={sessionError}\n theme={theme}\n />\n </Shell>\n );\n }\n\n // Session still resolving: a spinner, never an error. org/user arrive a beat\n // after mount and a flash of failure reads as a broken feature.\n if (!viewer) {\n return (\n <Shell theme={theme} testID={testID}>\n <View style={styles.center}>\n <ActivityIndicator />\n </View>\n </Shell>\n );\n }\n\n if (route === 'starred') {\n return (\n <Shell theme={theme} testID={testID}>\n <StarredMessagesScreen\n gql={services.gql}\n viewerId={viewer.userId}\n conversations={conversations.conversations}\n theme={theme}\n onBack={() => setRoute('list')}\n onOpen={(channelId, messageId) => {\n setListRoute('list');\n openThread(channelId, messageId);\n }}\n />\n </Shell>\n );\n }\n\n if (route === 'messageInfo' && infoMessage && activeChannelId) {\n return (\n <Shell theme={theme} testID={testID}>\n <MessageInfoScreen\n gql={services.gql}\n channelId={activeChannelId}\n viewerId={viewer.userId}\n message={infoMessage}\n isGroup={activeConversation ? !activeConversation.isDirect : false}\n theme={theme}\n onBack={() => {\n setInfoMessage(null);\n setRoute('thread');\n }}\n />\n </Shell>\n );\n }\n\n if (route === 'forward' && forwarding) {\n return (\n <Shell theme={theme} testID={testID}>\n <ForwardScreen\n message={forwarding}\n conversations={conversations.conversations}\n theme={theme}\n onCancel={() => {\n setForwarding(null);\n setRoute('thread');\n }}\n onSend={sendForward}\n />\n </Shell>\n );\n }\n\n if (route === 'notifications') {\n return (\n <Shell theme={theme} testID={testID}>\n <NotificationSettingsScreen\n theme={theme}\n settings={services.notificationSettings}\n push={services.push}\n onBack={() => setRoute(notificationsBack === 'info' && activeChannelId ? 'info' : 'list')}\n />\n </Shell>\n );\n }\n\n if (route === 'info' && activeChannelId) {\n return (\n <Shell theme={theme} testID={testID}>\n <ChatInfoScreen\n title={activeTitle}\n avatarUrl={activeConversation?.avatarUrl}\n isGroup={activeConversation ? !activeConversation.isDirect : false}\n memberNames={activeConversation?.memberNames ?? []}\n mutedUntil={activeConversation?.mutedUntil ?? 0}\n theme={theme}\n busy={muteBusy}\n error={infoError}\n onBack={() => setRoute('thread')}\n onMute={setMute}\n onUnmute={() => setMute(null)}\n onOpenNotifications={() => {\n setNotificationsBack('info');\n setRoute('notifications');\n }}\n onDismissError={() => setInfoError(null)}\n />\n </Shell>\n );\n }\n\n if (route === 'thread' && activeChannelId) {\n const threadError = thread.error === dismissedError ? null : thread.error;\n const isGroup = activeConversation ? !activeConversation.isDirect : false;\n const now = Date.now();\n const muted = activeConversation ? isMuted(activeConversation, now) : false;\n let subtitle = 'tap here for contact info';\n if (isGroup) subtitle = [...(activeConversation?.memberNames ?? []), 'You'].join(', ');\n else if (muted) subtitle = muteLabel(activeConversation?.mutedUntil ?? 0, now);\n return (\n <Shell theme={theme} testID={testID}>\n <ThreadScreen\n title={activeTitle}\n subtitle={subtitle}\n avatarUrl={activeConversation?.avatarUrl}\n isGroup={isGroup}\n muted={muted}\n viewerId={viewer.userId}\n readWatermark={readWatermark}\n deliveredWatermark={deliveredWatermark}\n initialUnreadCount={openedUnread}\n initialJumpTo={jumpTo}\n typingText={typingText}\n infoLabel={isGroup ? 'Group info' : 'Contact info'}\n onDraftChange={(text) => {\n typing.onDraftChange(text);\n saveDraft(activeChannelId, text);\n }}\n initialDraft={activeConversation?.draft}\n onShowInfo={(message) => {\n setInfoMessage(message);\n setRoute('messageInfo');\n }}\n onEdit={thread.edit}\n onDeleteForEveryone={thread.deleteForEveryone}\n onDeleteForMe={thread.deleteForMe}\n onStar={thread.star}\n onForward={(message) => {\n setForwarding(message);\n setRoute('forward');\n }}\n onSearch={searchChat}\n onLoadUntil={thread.loadUntil}\n onOpenInfo={() => {\n setInfoError(null);\n setRoute('info');\n }}\n messages={thread.messages}\n loading={thread.loading}\n loadingMore={thread.loadingMore}\n error={threadError}\n theme={theme}\n connectionState={services.gql.connectionState}\n haptics={services.haptics}\n onBack={() => setRoute(listRoute)}\n onSend={(body, replyTo) => {\n typing.onSent();\n return thread.send(body, replyTo);\n }}\n onLoadMore={thread.loadMore}\n onRetry={thread.retry}\n onReact={(messageId, emoji) => {\n const current = thread.messages\n .find((m) => m.id === messageId)\n ?.reactions.find((r) => r.mine)?.reaction;\n // Tapping your current reaction removes it, as in WhatsApp.\n thread.react(messageId, current === emoji ? null : emoji);\n }}\n onCopyText={services.clipboard ? (text) => void services.clipboard?.copy(text) : undefined}\n onShareText={services.link ? (text) => void services.link?.share(text) : undefined}\n media={services.media}\n audio={services.audio}\n linkPreviews={linkPreviews}\n onOpenLink={onOpenLink}\n onSendAttachments={\n thread.sendAttachments\n ? (files, caption, kind, replyTo) => thread.sendAttachments?.(files, caption, kind, replyTo)\n : undefined\n }\n onDismissError={() => setDismissedError(thread.error)}\n />\n </Shell>\n );\n }\n\n if (route === 'contacts') {\n return (\n <Shell theme={theme} testID={testID}>\n <ContactsScreen\n permission={contactMatches.permission}\n loading={contactMatches.loading}\n error={startChatError ?? contactMatches.error}\n onYantra={contactMatches.onYantra}\n invitable={contactMatches.invitable}\n theme={theme}\n busyContactId={busyContactId}\n onBack={() => setRoute('list')}\n onRequestAccess={() => void contactMatches.requestAccess()}\n onOpenSettings={() => void contactMatches.openSettings()}\n onStartChat={(c) => void startChatWith(c)}\n onInvite={inviteContact}\n limited={contactMatches.limited}\n onChooseMoreContacts={\n contactMatches.chooseMoreContacts ? () => void contactMatches.chooseMoreContacts?.() : undefined\n }\n onDismissError={() => {\n if (startChatError) setStartChatError(null);\n else void contactMatches.refresh();\n }}\n />\n <InviteSheet\n visible={inviteSheetOpen}\n name={inviteTarget ? inviteTarget.match?.displayName || inviteTarget.displayName : ''}\n number={inviteTarget?.rawNumbers?.[0] ?? inviteTarget?.e164[0] ?? null}\n imageUri={inviteTarget?.imageUri ?? null}\n canWhatsApp={Boolean(inviteTarget && whatsAppInviteUrl(inviteTarget.e164[0], 'x'))}\n theme={theme}\n onClose={() => setInviteSheetOpen(false)}\n onChoose={(channel) => void sendInvite(channel)}\n onCopy={() => {\n if (inviteMessage) void services.link?.copy(inviteMessage);\n }}\n />\n </Shell>\n );\n }\n\n const listError = conversations.error === dismissedError ? null : conversations.error;\n return (\n <Shell theme={theme} testID={testID}>\n <ConversationListScreen\n conversations={conversations.conversations}\n loading={conversations.loading}\n refreshing={conversations.refreshing}\n error={listError}\n theme={theme}\n connectionState={services.gql.connectionState}\n canInvite\n onRefresh={() => {\n conversations.refresh();\n void contactMatches.refresh();\n }}\n onRetry={conversations.refresh}\n loadingMore={conversations.loadingMore}\n onLoadMore={conversations.loadMore}\n onOpen={openThread}\n onNewChat={() => setRoute('contacts')}\n onOpenNotifications={() => {\n setNotificationsBack('list');\n setRoute('notifications');\n }}\n pushStatus={services.push?.status}\n onEnablePush={services.push ? () => services.push?.enable() : undefined}\n onDismissError={() => setDismissedError(conversations.error)}\n notice={inviteNotice}\n onDismissNotice={() => setInviteNotice(null)}\n mode={route === 'archived' ? 'archived' : 'chats'}\n archivedCount={conversations.conversations.filter((c) => c.archivedAt > 0).length}\n onOpenArchived={() => {\n setListRoute('archived');\n setRoute('archived');\n }}\n onOpenStarred={() => setRoute('starred')}\n onBack={() => {\n setListRoute('list');\n setRoute('list');\n }}\n onSetListState={conversations.setListState}\n />\n </Shell>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center' },\n});\n\nexport default NativeChatExperience;\n"],"names":["_a","_b","_c","_d","link"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NativeChatExperience.js","sources":["../../../src/features/messaging/NativeChatExperience.tsx"],"sourcesContent":["/**\n * The chat remote's exposed root (`chat_native/Chat`).\n *\n * Owns its own navigation as local state - the remote must not import\n * @react-navigation, because a second copy of the navigator would not share the\n * host's container. Android hardware back is handled with RN's own BackHandler.\n *\n * Everything here is plain react-native (plus expo-image and\n * @expo/vector-icons, both host-shared singletons) - no gluestack, no\n * NativeWind, no Apollo - because a federated remote may only use what the host\n * shares, and every extra dependency is another way to fail to load on a device\n * in a way the simulator will not reproduce.\n */\nimport * as React from 'react';\nimport { ActivityIndicator, AppState, BackHandler, Platform, StyleSheet, View } from 'react-native';\nimport type { NativeChatExperienceProps } from './chatHost';\nimport { chatThemes, EmptyState } from './ChatComponents';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { ConversationListScreen } from './ConversationListScreen';\nimport { ContactsScreen } from './ContactsScreen';\nimport { ThreadScreen, type ChatSearchHit } from './ThreadScreen';\nimport { ChatInfoScreen } from './ChatInfoScreen';\nimport { NotificationSettingsScreen } from './NotificationSettingsScreen';\nimport { ForwardScreen } from './ForwardScreen';\nimport { NewGroupScreen, type GroupCandidate } from './NewGroupScreen';\nimport { ActionSheet } from './ActionSheet';\nimport { StarredMessagesScreen } from './StarredMessagesScreen';\nimport { MessageInfoScreen } from './MessageInfoScreen';\nimport { MediaGalleryScreen } from './MediaGalleryScreen';\nimport { BlockedContactsScreen } from './BlockedContactsScreen';\nimport { PollVotesScreen } from './PollVotesScreen';\nimport { forwardMessage, useConversations, useMarkRead, useReadWatermark, useThread, useTyping } from './useChatData';\nimport {\n SEARCH_MESSAGES_QUERY,\n SET_CHANNEL_MUTE_MUTATION,\n SET_DRAFT_MUTATION,\n VIEW_CHANNEL_MUTATION,\n YANTRA_CHAT_INVITER_QUERY,\n} from './chatOperations';\nimport {\n displayNameOf,\n isMuted,\n messageStatus,\n muteLabel,\n muteUntilFor,\n toChatMessage,\n toEpoch,\n type ChatMessage,\n type ChatMuteOption,\n type WirePost,\n} from './chatModel';\nimport { ImageViewer } from './ChatAttachments';\nimport { buildChatInviteUrl, chatInviteMessage, whatsAppInviteUrl } from './chatInviteLink';\nimport { InviteSheet, type InviteChannel } from './InviteSheet';\nimport { createLinkPreviewLoader, openChatLink } from './linkPreview';\nimport { useContactMatches, type MatchedContact } from './useContactMatches';\n\n/** Used only when the host predates `chatInviteUrl`; the host supplies the per-environment domain. */\nconst DEFAULT_INVITE_WEB_BASE = 'https://yantra.app';\n\n/** The screens the remote routes between internally. */\nexport type ChatRoute =\n | 'list'\n | 'archived'\n | 'starred'\n | 'forward'\n | 'messageInfo'\n | 'thread'\n | 'contacts'\n | 'newGroup'\n | 'addParticipants'\n | 'info'\n | 'notifications'\n | 'media'\n | 'blocked'\n | 'pollVotes';\n\n/** A draft is saved this long after the last keystroke (and at once when the chat is left). */\nconst DRAFT_SAVE_DELAY_MS = 800;\n\n/** While a chat is open, the server hears \"read\" at most this often as messages land. */\nconst LIVE_READ_THROTTLE_MS = 2_000;\n\nfunction Shell({ theme, testID, children }: { theme: { bg: string }; testID?: string; children: React.ReactNode }) {\n return (\n <View testID={testID ?? 'chat-native'} style={[styles.fill, { backgroundColor: theme.bg }]}>\n {children}\n </View>\n );\n}\n\nexport function NativeChatExperience({\n viewer,\n sessionError,\n services,\n initialChannelId,\n initialChannelAt,\n initialPeer,\n onActiveChannelChange,\n onInternalRouteChange,\n testID,\n}: NativeChatExperienceProps) {\n const { isDark } = useAppTheme();\n const theme = isDark ? chatThemes.dark : chatThemes.light;\n\n const [route, setRoute] = React.useState<ChatRoute>(initialChannelId ? 'thread' : 'list');\n const [activeChannelId, setActiveChannelId] = React.useState<string | null>(initialChannelId ?? null);\n const [dismissedError, setDismissedError] = React.useState<string | null>(null);\n /** Where Notifications' back button returns to. */\n const [notificationsBack, setNotificationsBack] = React.useState<'list' | 'info'>('list');\n /** Unread when the open chat was opened, captured before the badge clears; places the unread band. */\n const [openedUnread, setOpenedUnread] = React.useState(0);\n const [muteBusy, setMuteBusy] = React.useState(false);\n const [infoError, setInfoError] = React.useState<string | null>(null);\n /** The message being forwarded (Forward screen). */\n const [forwarding, setForwarding] = React.useState<ChatMessage | null>(null);\n /** The message whose Message info is open. */\n const [infoMessage, setInfoMessage] = React.useState<ChatMessage | null>(null);\n /** The poll whose votes the \"Poll votes\" screen is showing. */\n const [pollVotesMessage, setPollVotesMessage] = React.useState<ChatMessage | null>(null);\n /** Where the Media gallery / Blocked list was opened from, so Back returns there. */\n const [galleryBack, setGalleryBack] = React.useState<ChatRoute>('info');\n /** Full-size image opened from the media gallery. */\n const [galleryImageUrl, setGalleryImageUrl] = React.useState<string | null>(null);\n /** Open the thread at this message (from Starred messages). */\n const [jumpTo, setJumpTo] = React.useState<string | null>(null);\n /** Where the list's back button / a thread's back goes: the main list or Archived. */\n const [listRoute, setListRoute] = React.useState<'list' | 'archived'>('list');\n /** Chat info and Forward sit on top of the open chat, so the transcript stays loaded underneath. */\n const threadChannelId =\n route === 'thread' || route === 'info' || route === 'forward' || route === 'messageInfo'\n ? activeChannelId\n : null;\n\n const conversations = useConversations(services, viewer, {\n syncListRealtime: route === 'list' || route === 'archived',\n });\n const { applyConversationMessage, applyConversationUpdate, markRead, setDraft } = conversations;\n\n // Drafts, WhatsApp-style: what the viewer leaves unsent stays with the chat (on the server,\n // so another device sees it too) and shows as \"Draft: …\" in the list.\n const pendingDraft = React.useRef<{ channelId: string; text: string } | null>(null);\n const draftTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const flushDraft = React.useCallback(() => {\n if (draftTimer.current) clearTimeout(draftTimer.current);\n draftTimer.current = null;\n const next = pendingDraft.current;\n pendingDraft.current = null;\n if (next) void services.gql.mutate(SET_DRAFT_MUTATION, { channelId: next.channelId, text: next.text });\n }, [services.gql]);\n const saveDraft = React.useCallback(\n (channelId: string, text: string) => {\n setDraft(channelId, text.trim());\n pendingDraft.current = { channelId, text };\n if (draftTimer.current) clearTimeout(draftTimer.current);\n draftTimer.current = setTimeout(flushDraft, DRAFT_SAVE_DELAY_MS);\n },\n [setDraft, flushDraft],\n );\n // Leaving the chat (or the whole screen) saves at once rather than dropping the last keystrokes.\n React.useEffect(() => {\n if (route !== 'thread') flushDraft();\n }, [route, flushDraft]);\n React.useEffect(() => flushDraft, [flushDraft]);\n const contactMatches = useContactMatches(services.gql, services.contacts, viewer, services.phone);\n const [busyContactId, setBusyContactId] = React.useState<string | null>(null);\n const [startChatError, setStartChatError] = React.useState<string | null>(null);\n // The viewer is reading as messages land, so the sender's ticks should turn blue now, not\n // when the viewer leaves the chat: tell the server, at most every couple of seconds.\n const liveReadAt = React.useRef(0);\n const liveReadTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const markReadLive = React.useCallback(\n (channelId: string) => {\n const wait = Math.max(0, liveReadAt.current + LIVE_READ_THROTTLE_MS - Date.now());\n if (liveReadTimer.current) return;\n liveReadTimer.current = setTimeout(() => {\n liveReadTimer.current = null;\n liveReadAt.current = Date.now();\n void services.gql.mutate(VIEW_CHANNEL_MUTATION, { id: channelId });\n }, wait);\n },\n [services.gql],\n );\n React.useEffect(\n () => () => {\n if (liveReadTimer.current) clearTimeout(liveReadTimer.current);\n },\n [],\n );\n const onThreadListUpdate = React.useCallback(\n (post: WirePost) => {\n if (!activeChannelId) return;\n applyConversationMessage(activeChannelId, post);\n // The viewer is looking at this thread, so a message arriving here is already read.\n markRead(activeChannelId);\n const author = post.author?.id ?? post.creator?.id;\n if (author && String(author) !== viewer?.userId) markReadLive(activeChannelId);\n },\n [activeChannelId, applyConversationMessage, markRead, markReadLive, viewer?.userId],\n );\n const onThreadUpdate = React.useCallback(\n (post: WirePost) => {\n if (activeChannelId) applyConversationUpdate(activeChannelId, post);\n },\n [activeChannelId, applyConversationUpdate],\n );\n const thread = useThread(services.gql, threadChannelId, viewer, {\n onConversationMessage: onThreadListUpdate,\n onConversationUpdate: onThreadUpdate,\n media: services.media,\n storage: services.storage,\n });\n const typing = useTyping(services.gql, route === 'thread' ? activeChannelId : null, viewer?.userId ?? null);\n\n // Clearing the badge is local-first; the mutation is fire-and-forget.\n useMarkRead(services.gql, route === 'thread' ? activeChannelId : null, markRead);\n\n // One loader for the whole messenger, so a link seen in two chats is read once.\n const linkPreviews = React.useMemo(() => createLinkPreviewLoader(services.gql), [services.gql]);\n const { link } = services;\n const onOpenLink = React.useMemo(() => {\n if (!link) return undefined;\n return (url: string) => {\n // openChatLink settles on its own (never rejects); the tap does not wait on it.\n openChatLink(url, { loader: linkPreviews, link }).catch(() => undefined);\n };\n }, [link, linkPreviews]);\n\n // Mark read again on LEAVING a thread, so messages that arrived while it was open\n // are not counted as unread by the server on the next list load.\n const threadOpenRef = React.useRef<string | null>(null);\n React.useEffect(() => {\n const open = route === 'thread' ? activeChannelId : null;\n const left = threadOpenRef.current;\n if (left && left !== open) void services.gql.mutate(VIEW_CHANNEL_MUTATION, { id: left });\n threadOpenRef.current = open;\n }, [route, activeChannelId, services.gql]);\n\n // The host suppresses a foreground push banner for the conversation already\n // on screen, so it has to be told every time that changes.\n React.useEffect(() => {\n onActiveChannelChange?.(route === 'thread' ? activeChannelId : null);\n }, [route, activeChannelId, onActiveChannelChange]);\n\n React.useEffect(() => {\n // Every screen but the list draws its own top bar, so the host hides its header for them.\n let internal: 'list' | 'thread' | 'contacts' = 'thread';\n if (route === 'list' || route === 'contacts') internal = route;\n onInternalRouteChange?.(internal);\n }, [route, onInternalRouteChange]);\n\n // The address book changes outside the app, so re-read it whenever the picker opens\n // and whenever the app returns to the foreground while the picker is showing.\n const refreshContactsRef = React.useRef(contactMatches.refresh);\n refreshContactsRef.current = contactMatches.refresh;\n const contactsGranted = contactMatches.permission === 'granted';\n React.useEffect(() => {\n if ((route !== 'contacts' && route !== 'newGroup') || !contactsGranted) return undefined;\n void refreshContactsRef.current();\n const sub = AppState.addEventListener('change', (state) => {\n if (state === 'active') void refreshContactsRef.current();\n });\n return () => sub.remove();\n }, [route, contactsGranted]);\n\n const activeConversation = React.useMemo(\n () => conversations.conversations.find((c) => c.id === activeChannelId) ?? null,\n [conversations.conversations, activeChannelId],\n );\n\n // Blue ticks: what the list knew when the chat opened, kept fresh while the viewer's\n // newest message is still waiting to be read.\n const listWatermark = activeConversation?.readWatermark ?? 0;\n const newestMine = React.useMemo(() => {\n for (let i = thread.messages.length - 1; i >= 0; i -= 1) {\n if (thread.messages[i].isMine) return thread.messages[i];\n }\n return null;\n }, [thread.messages]);\n const liveWatermark = useReadWatermark(\n services.gql,\n route === 'thread' ? activeChannelId : null,\n viewer?.userId ?? null,\n Boolean(\n newestMine &&\n newestMine.sendState !== 'sending' &&\n messageStatus(newestMine, listWatermark, activeConversation?.deliveredWatermark ?? 0) !== 'read',\n ),\n );\n const readWatermark = Math.max(listWatermark, liveWatermark.read);\n const deliveredWatermark = Math.max(activeConversation?.deliveredWatermark ?? 0, liveWatermark.delivered);\n\n // \"typing…\" in the header: the person in a one-to-one chat, or who it is in a group.\n const typingText = React.useMemo(() => {\n const ids = typing.typingUserIds;\n if (!ids.length) return '';\n if (activeConversation?.isDirect !== false) return 'typing…';\n if (ids.length > 1) return `${ids.length} people are typing…`;\n const name = thread.messages.find((m) => m.authorId === ids[0])?.authorName ?? 'Someone';\n return `${name.split(' ')[0]} is typing…`;\n }, [typing.typingUserIds, activeConversation?.isDirect, thread.messages]);\n\n const searchChat = React.useCallback(\n async (query: string): Promise<ChatSearchHit[]> => {\n if (!activeChannelId || !viewer?.userId) return [];\n const res = await services.gql.query<{ searchMessages?: { data?: (WirePost | null)[] | null } | null }>(\n SEARCH_MESSAGES_QUERY,\n { query, channelId: activeChannelId, limit: 50, skip: 0 },\n { fetchPolicy: 'network-only' },\n );\n return (res.data?.searchMessages?.data ?? [])\n .filter((p): p is WirePost => Boolean(p?.id && !p.deletedAt))\n .map((post) => {\n const m = toChatMessage(post, viewer.userId);\n return {\n id: m.id,\n body: m.body,\n createdAt: m.createdAt,\n authorName: m.isMine ? 'You' : m.authorName,\n };\n });\n },\n [activeChannelId, services.gql, viewer?.userId],\n );\n\n const sendForward = React.useCallback(\n async (channelIds: string[]): Promise<string[]> => {\n if (!forwarding) return [];\n const { sent, posts } = await forwardMessage(services.gql, forwarding.body, channelIds);\n posts.forEach(({ channelId, post }) => applyConversationMessage(channelId, post));\n if (sent.length === channelIds.length) {\n services.haptics?.impact('light');\n setForwarding(null);\n setRoute('thread');\n }\n return sent;\n },\n [forwarding, services.gql, services.haptics, applyConversationMessage],\n );\n\n const setMute = React.useCallback(\n async (option: ChatMuteOption | null) => {\n const id = activeChannelId;\n if (!id || muteBusy) return;\n const previous = conversations.conversations.find((c) => c.id === id)?.mutedUntil ?? 0;\n const until = option ? muteUntilFor(option, Date.now()) : null;\n setMuteBusy(true);\n setInfoError(null);\n conversations.setMutedUntil(id, until ? toEpoch(until) : 0);\n const res = await services.gql.mutate<{ setChannelMute?: boolean | null }>(SET_CHANNEL_MUTE_MUTATION, {\n channelId: id,\n mutedUntil: until,\n });\n setMuteBusy(false);\n if (res.errors?.length || !res.data?.setChannelMute) {\n conversations.setMutedUntil(id, previous);\n setInfoError(\n option\n ? 'Couldn’t mute this chat. Please try again.'\n : 'Couldn’t unmute this chat. Please try again.',\n );\n }\n },\n [activeChannelId, muteBusy, conversations, services.gql],\n );\n\n // Run a group-management mutation on the info screen, surfacing an error banner on failure.\n const runGroupAction = React.useCallback(\n async (fn: () => Promise<string | boolean | null>) => {\n if (muteBusy) return;\n setMuteBusy(true);\n setInfoError(null);\n try {\n const ok = await fn();\n if (!ok) setInfoError('Something went wrong. Please try again.');\n } finally {\n setMuteBusy(false);\n }\n },\n [muteBusy],\n );\n\n // Exit group: a confirm sheet, then leave and return to the list.\n const [exitConfirmId, setExitConfirmId] = React.useState<string | null>(null);\n const confirmExitGroup = React.useCallback((channelId: string) => setExitConfirmId(channelId), []);\n const doExitGroup = React.useCallback(\n async (channelId: string) => {\n setExitConfirmId(null);\n const ok = await conversations.leaveGroup(channelId);\n if (ok) {\n setListRoute('list');\n setRoute('list');\n } else {\n setInfoError('Couldn’t leave this group. Please try again.');\n }\n },\n [conversations],\n );\n\n // Android back pops the internal stack before the host's navigator sees it.\n React.useEffect(() => {\n if (Platform.OS !== 'android') return undefined;\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n if (route === 'list') return false;\n if (route === 'info' || route === 'forward' || route === 'messageInfo') setRoute('thread');\n else if (route === 'addParticipants') setRoute('info');\n else if (route === 'notifications') setRoute(notificationsBack === 'info' ? 'info' : 'list');\n else if (route === 'media' || route === 'blocked') setRoute(galleryBack);\n else if (route === 'pollVotes') setRoute('thread');\n else if (route === 'thread') setRoute(listRoute);\n else setRoute('list');\n return true;\n });\n return () => sub.remove();\n }, [route, notificationsBack, listRoute, galleryBack]);\n\n const conversationsRef = React.useRef(conversations.conversations);\n conversationsRef.current = conversations.conversations;\n const openThread = React.useCallback((id: string, messageId?: string) => {\n setOpenedUnread(conversationsRef.current.find((c) => c.id === id)?.unreadCount ?? 0);\n setInfoError(null);\n setJumpTo(messageId ?? null);\n setActiveChannelId(id);\n setRoute('thread');\n }, []);\n\n // A notification tapped while Chats is already open: go to that conversation.\n React.useEffect(() => {\n if (initialChannelId && initialChannelAt) openThread(initialChannelId);\n }, [initialChannelId, initialChannelAt, openThread]);\n\n /**\n * Open (or reuse) the conversation with a matched contact. createDirectChannel\n * is idempotent server-side, so tapping someone you already talk to lands in\n * the existing thread rather than making a second one.\n */\n const startChatWith = React.useCallback(\n async (contact: MatchedContact) => {\n if (!contact.match || busyContactId) return;\n setBusyContactId(contact.id);\n setStartChatError(null);\n try {\n const id = await conversations.openDirect(contact.match.userId, contact.match.displayName);\n if (id) openThread(id);\n else setStartChatError('Could not start this conversation. Please try again.');\n } finally {\n setBusyContactId(null);\n }\n },\n [conversations, openThread, busyContactId],\n );\n\n // Opened from a chat invite link: go straight into the conversation with the inviter\n // (createDirectChannel is idempotent, so reopening an old invite lands in the same thread).\n // The link is editable by anyone, so the server has to vouch for the inviter first, and\n // its name is used - never the one in the link.\n // Tracks the invite object, not the user: every tap on a link arrives as a new object,\n // so reopening a link retries, while re-renders of the same one do not.\n const openedPeer = React.useRef<typeof initialPeer | null>(null);\n const [inviteNotice, setInviteNotice] = React.useState<string | null>(null);\n const { openDirect } = conversations;\n React.useEffect(() => {\n const peer = initialPeer;\n if (!peer?.userId || !viewer?.userId || peer.userId === viewer.userId) return;\n if (openedPeer.current === peer) return;\n openedPeer.current = peer;\n void (async () => {\n const res = await services.gql.query<{\n yantraChatInviter?: { userId: string; displayName: string } | null;\n }>(YANTRA_CHAT_INVITER_QUERY, { userId: peer.userId }, { fetchPolicy: 'network-only' });\n const inviter = res.data?.yantraChatInviter;\n if (!inviter) {\n setInviteNotice(\n res.errors?.length\n ? 'Could not open this invite. Check your connection and open the link again.'\n : 'This invite link is not valid anymore. Ask for a new one.',\n );\n return;\n }\n const id = await openDirect(inviter.userId, inviter.displayName);\n if (id) openThread(id);\n else setInviteNotice(`Could not start a conversation with ${inviter.displayName}. Please try again.`);\n })();\n }, [initialPeer, viewer?.userId, services.gql, openDirect, openThread]);\n\n /**\n * Invite someone who is not here yet: tapping Invite opens the invite sheet (Messages,\n * WhatsApp, copy link, share sheet) and the chosen app opens with the invite prefilled.\n * Nothing is sent without the person tapping Send there.\n *\n * The link names the inviter (so the app can open this conversation on arrival) and\n * carries no phone numbers.\n */\n const [inviteTarget, setInviteTarget] = React.useState<MatchedContact | null>(null);\n const [inviteSheetOpen, setInviteSheetOpen] = React.useState(false);\n\n const inviteContact = React.useCallback(\n (contact: MatchedContact) => {\n if (!services.link || !viewer?.userId) return;\n setInviteTarget(contact);\n setInviteSheetOpen(true);\n },\n [services.link, viewer?.userId],\n );\n\n const inviteMessage = React.useMemo(() => {\n if (!viewer?.userId) return '';\n const invite = { inviterId: viewer.userId, inviterName: viewer.displayName ?? null };\n const url = services.phone?.chatInviteUrl?.(invite) ?? buildChatInviteUrl(DEFAULT_INVITE_WEB_BASE, invite);\n return chatInviteMessage(viewer.displayName, url);\n }, [services.phone, viewer?.userId, viewer?.displayName]);\n\n const sendInvite = React.useCallback(\n async (channel: Exclude<InviteChannel, 'copy'>) => {\n const { link } = services;\n const contact = inviteTarget;\n if (!link || !contact || !inviteMessage) return;\n if (channel === 'whatsapp') {\n const url = whatsAppInviteUrl(contact.e164[0], inviteMessage);\n if (url) {\n await link.openUrl(url);\n return;\n }\n }\n if (channel === 'sms') {\n // Saved numbers, not our E.164 guesses: the phone dials them in its own region.\n const smsTo = contact.rawNumbers?.length ? contact.rawNumbers.slice(0, 1) : contact.e164.slice(0, 1);\n if (smsTo.length && (await link.composeSms(smsTo, inviteMessage)) === 'opened') return;\n }\n // 'share', and the fallback where Messages is unavailable (every simulator).\n await link.share(inviteMessage);\n },\n [services.link, inviteTarget, inviteMessage],\n );\n\n const activeTitle = React.useMemo(\n () => conversations.conversations.find((c) => c.id === activeChannelId)?.title ?? 'Chat',\n [conversations.conversations, activeChannelId],\n );\n\n if (sessionError) {\n return (\n <Shell theme={theme} testID={testID}>\n <EmptyState\n icon=\"alert-circle-outline\"\n title=\"Chat is unavailable\"\n detail={sessionError}\n theme={theme}\n />\n </Shell>\n );\n }\n\n // Session still resolving: a spinner, never an error. org/user arrive a beat\n // after mount and a flash of failure reads as a broken feature.\n if (!viewer) {\n return (\n <Shell theme={theme} testID={testID}>\n <View style={styles.center}>\n <ActivityIndicator />\n </View>\n </Shell>\n );\n }\n\n if (route === 'starred') {\n return (\n <Shell theme={theme} testID={testID}>\n <StarredMessagesScreen\n gql={services.gql}\n viewerId={viewer.userId}\n conversations={conversations.conversations}\n theme={theme}\n onBack={() => setRoute('list')}\n onOpen={(channelId, messageId) => {\n setListRoute('list');\n openThread(channelId, messageId);\n }}\n />\n </Shell>\n );\n }\n\n if (route === 'media') {\n return (\n <Shell theme={theme} testID={testID}>\n <MediaGalleryScreen\n gql={services.gql}\n channelId={activeChannelId}\n viewerId={viewer.userId}\n theme={theme}\n fileBaseUrl={services.media?.fileBaseUrl}\n linkPreviews={linkPreviews}\n onOpenLink={onOpenLink}\n onOpenImage={setGalleryImageUrl}\n onBack={() => setRoute(galleryBack)}\n />\n <ImageViewer url={galleryImageUrl} onClose={() => setGalleryImageUrl(null)} />\n </Shell>\n );\n }\n\n if (route === 'blocked') {\n return (\n <Shell theme={theme} testID={testID}>\n <BlockedContactsScreen\n gql={services.gql}\n theme={theme}\n onBack={() => setRoute(galleryBack)}\n onUnblock={conversations.unblockContact}\n />\n </Shell>\n );\n }\n\n if (route === 'pollVotes' && pollVotesMessage) {\n const members = activeConversation?.members ?? [];\n const peer = activeConversation?.peer ?? null;\n const nameOf = (id: string): string => {\n const m = members.find((mm) => mm.id === id);\n if (m) return m.name;\n if (peer && String(peer.id) === id) return displayNameOf(peer);\n return 'Someone';\n };\n return (\n <Shell theme={theme} testID={testID}>\n <PollVotesScreen\n poll={pollVotesMessage.poll ?? null}\n theme={theme}\n viewerId={viewer.userId}\n nameOf={nameOf}\n onBack={() => {\n setPollVotesMessage(null);\n setRoute('thread');\n }}\n />\n </Shell>\n );\n }\n\n if (route === 'messageInfo' && infoMessage && activeChannelId) {\n return (\n <Shell theme={theme} testID={testID}>\n <MessageInfoScreen\n gql={services.gql}\n channelId={activeChannelId}\n viewerId={viewer.userId}\n message={infoMessage}\n isGroup={activeConversation ? !activeConversation.isDirect : false}\n theme={theme}\n onBack={() => {\n setInfoMessage(null);\n setRoute('thread');\n }}\n />\n </Shell>\n );\n }\n\n if (route === 'forward' && forwarding) {\n return (\n <Shell theme={theme} testID={testID}>\n <ForwardScreen\n message={forwarding}\n conversations={conversations.conversations}\n theme={theme}\n onCancel={() => {\n setForwarding(null);\n setRoute('thread');\n }}\n onSend={sendForward}\n />\n </Shell>\n );\n }\n\n if (route === 'notifications') {\n return (\n <Shell theme={theme} testID={testID}>\n <NotificationSettingsScreen\n theme={theme}\n settings={services.notificationSettings}\n push={services.push}\n onBack={() => setRoute(notificationsBack === 'info' && activeChannelId ? 'info' : 'list')}\n />\n </Shell>\n );\n }\n\n if (route === 'info' && activeChannelId) {\n const infoIsGroup = activeConversation ? !activeConversation.isDirect : false;\n const infoPeerId = !infoIsGroup && activeConversation?.peer?.id ? String(activeConversation.peer.id) : null;\n const infoPeerBlocked = Boolean(infoPeerId && conversations.isPeerBlocked(infoPeerId));\n // DMs: either member may set the timer. Groups: admins only (the server also enforces this).\n const canSetDisappearing = activeConversation\n ? activeConversation.isDirect || activeConversation.viewerIsAdmin\n : false;\n return (\n <Shell theme={theme} testID={testID}>\n <ChatInfoScreen\n title={activeTitle}\n avatarUrl={activeConversation?.avatarUrl}\n isGroup={infoIsGroup}\n members={activeConversation?.members ?? []}\n description={activeConversation?.description}\n viewerIsAdmin={Boolean(activeConversation?.viewerIsAdmin)}\n onlyAdminsSend={Boolean(activeConversation?.onlyAdminsSend)}\n onAddMembers={activeChannelId ? () => setRoute('addParticipants') : undefined}\n onRemoveMember={\n activeChannelId\n ? (memberId) =>\n void runGroupAction(() => conversations.removeGroupMember(activeChannelId, memberId))\n : undefined\n }\n onSetAdmin={\n activeChannelId\n ? (memberId, admin) =>\n void runGroupAction(() =>\n conversations.setGroupAdmin(activeChannelId, memberId, admin),\n )\n : undefined\n }\n onSetSendPolicy={\n activeChannelId\n ? (onlyAdmins) =>\n void runGroupAction(() =>\n conversations.setGroupSendPolicy(activeChannelId, onlyAdmins),\n )\n : undefined\n }\n onExitGroup={activeChannelId ? () => confirmExitGroup(activeChannelId) : undefined}\n mutedUntil={activeConversation?.mutedUntil ?? 0}\n theme={theme}\n busy={muteBusy}\n error={infoError}\n onBack={() => setRoute('thread')}\n onMute={setMute}\n onUnmute={() => setMute(null)}\n onOpenNotifications={() => {\n setNotificationsBack('info');\n setRoute('notifications');\n }}\n onDismissError={() => setInfoError(null)}\n disappearingSeconds={activeConversation?.disappearingSeconds ?? 0}\n onSetDisappearing={\n canSetDisappearing\n ? (seconds) =>\n void runGroupAction(() => conversations.setDisappearing(activeChannelId, seconds))\n : undefined\n }\n onOpenMedia={() => {\n setGalleryBack('info');\n setRoute('media');\n }}\n isBlocked={infoPeerBlocked}\n peerName={activeConversation?.title}\n onBlock={infoPeerId ? () => void conversations.blockContact(infoPeerId) : undefined}\n onUnblock={infoPeerId ? () => void conversations.unblockContact(infoPeerId) : undefined}\n onReport={\n infoPeerId\n ? (alsoBlock) => void conversations.reportTarget('CONTACT', infoPeerId, { alsoBlock })\n : undefined\n }\n />\n <ActionSheet\n visible={Boolean(exitConfirmId)}\n title=\"Exit group?\"\n detail=\"You will no longer receive messages from this group. Admins will be notified.\"\n actions={[\n {\n key: 'exit',\n label: 'Exit group',\n icon: 'exit-to-app',\n destructive: true,\n onPress: () => {\n if (exitConfirmId) void doExitGroup(exitConfirmId);\n },\n },\n ]}\n theme={theme}\n onClose={() => setExitConfirmId(null)}\n testID=\"chat-exit-group-sheet\"\n />\n </Shell>\n );\n }\n\n if (route === 'thread' && activeChannelId) {\n const threadError = thread.error === dismissedError ? null : thread.error;\n const isGroup = activeConversation ? !activeConversation.isDirect : false;\n const now = Date.now();\n const muted = activeConversation ? isMuted(activeConversation, now) : false;\n let subtitle = 'tap here for contact info';\n if (isGroup) subtitle = [...(activeConversation?.memberNames ?? []), 'You'].join(', ');\n else if (muted) subtitle = muteLabel(activeConversation?.mutedUntil ?? 0, now);\n const groupMembers = isGroup ? (activeConversation?.members ?? []) : [];\n const viewerInGroup = !isGroup || groupMembers.length === 0 || groupMembers.some((m) => m.isYou);\n const composerLock: 'adminsOnly' | 'notParticipant' | null = !isGroup\n ? null\n : !viewerInGroup\n ? 'notParticipant'\n : activeConversation?.onlyAdminsSend && !activeConversation?.viewerIsAdmin\n ? 'adminsOnly'\n : null;\n const memberNameOf = (id: string | null | undefined): string => {\n if (!id) return 'Someone';\n if (String(id) === viewer.userId) return viewer.displayName ?? 'You';\n return groupMembers.find((m) => m.id === String(id))?.name || 'Someone';\n };\n const peerId = !isGroup ? (activeConversation?.peer?.id ? String(activeConversation.peer.id) : null) : null;\n const peerBlocked = Boolean(peerId && conversations.isPeerBlocked(peerId));\n const disappearingOn = (activeConversation?.disappearingSeconds ?? 0) > 0;\n return (\n <Shell theme={theme} testID={testID}>\n <ThreadScreen\n title={activeTitle}\n subtitle={subtitle}\n avatarUrl={activeConversation?.avatarUrl}\n isGroup={isGroup}\n muted={muted}\n viewerId={viewer.userId}\n readWatermark={readWatermark}\n deliveredWatermark={deliveredWatermark}\n initialUnreadCount={openedUnread}\n initialJumpTo={jumpTo}\n typingText={typingText}\n infoLabel={isGroup ? 'Group info' : 'Contact info'}\n onDraftChange={(text) => {\n typing.onDraftChange(text);\n saveDraft(activeChannelId, text);\n }}\n initialDraft={activeConversation?.draft}\n onShowInfo={(message) => {\n setInfoMessage(message);\n setRoute('messageInfo');\n }}\n onEdit={thread.edit}\n onDeleteForEveryone={thread.deleteForEveryone}\n onDeleteForMe={thread.deleteForMe}\n onStar={thread.star}\n onForward={(message) => {\n setForwarding(message);\n setRoute('forward');\n }}\n onSearch={searchChat}\n onLoadUntil={thread.loadUntil}\n onOpenInfo={() => {\n setInfoError(null);\n setRoute('info');\n }}\n messages={thread.messages}\n loading={thread.loading}\n loadingMore={thread.loadingMore}\n error={threadError}\n theme={theme}\n connectionState={services.gql.connectionState}\n haptics={services.haptics}\n onBack={() => setRoute(listRoute)}\n onSend={(body, replyTo, mentions) => {\n typing.onSent();\n return thread.send(body, replyTo, mentions);\n }}\n memberNameOf={memberNameOf}\n mentionCandidates={isGroup ? groupMembers : []}\n composerLock={composerLock}\n onLoadMore={thread.loadMore}\n onRetry={thread.retry}\n onReact={(messageId, emoji) => {\n const current = thread.messages\n .find((m) => m.id === messageId)\n ?.reactions.find((r) => r.mine)?.reaction;\n // Tapping your current reaction removes it, as in WhatsApp.\n thread.react(messageId, current === emoji ? null : emoji);\n }}\n onCopyText={services.clipboard ? (text) => void services.clipboard?.copy(text) : undefined}\n onShareText={services.link ? (text) => void services.link?.share(text) : undefined}\n onVote={thread.vote}\n onViewVotes={(message) => {\n setPollVotesMessage(message);\n setRoute('pollVotes');\n }}\n onCreatePoll={thread.createPoll}\n onReportMessage={(message) => void conversations.reportTarget('MESSAGE', message.id)}\n onKeep={disappearingOn ? thread.keep : undefined}\n peerBlocked={peerBlocked}\n onUnblockPeer={peerId ? () => void conversations.unblockContact(peerId) : undefined}\n media={services.media}\n audio={services.audio}\n linkPreviews={linkPreviews}\n onOpenLink={onOpenLink}\n onSendAttachments={\n thread.sendAttachments\n ? (files, caption, kind, replyTo) => thread.sendAttachments?.(files, caption, kind, replyTo)\n : undefined\n }\n onDismissError={() => setDismissedError(thread.error)}\n />\n </Shell>\n );\n }\n\n if (route === 'contacts') {\n return (\n <Shell theme={theme} testID={testID}>\n <ContactsScreen\n permission={contactMatches.permission}\n loading={contactMatches.loading}\n error={startChatError ?? contactMatches.error}\n onYantra={contactMatches.onYantra}\n invitable={contactMatches.invitable}\n theme={theme}\n busyContactId={busyContactId}\n onBack={() => setRoute('list')}\n onRequestAccess={() => void contactMatches.requestAccess()}\n onOpenSettings={() => void contactMatches.openSettings()}\n onStartChat={(c) => void startChatWith(c)}\n onInvite={inviteContact}\n limited={contactMatches.limited}\n onChooseMoreContacts={\n contactMatches.chooseMoreContacts ? () => void contactMatches.chooseMoreContacts?.() : undefined\n }\n onDismissError={() => {\n if (startChatError) setStartChatError(null);\n else void contactMatches.refresh();\n }}\n />\n <InviteSheet\n visible={inviteSheetOpen}\n name={inviteTarget ? inviteTarget.match?.displayName || inviteTarget.displayName : ''}\n number={inviteTarget?.rawNumbers?.[0] ?? inviteTarget?.e164[0] ?? null}\n imageUri={inviteTarget?.imageUri ?? null}\n canWhatsApp={Boolean(inviteTarget && whatsAppInviteUrl(inviteTarget.e164[0], 'x'))}\n theme={theme}\n onClose={() => setInviteSheetOpen(false)}\n onChoose={(channel) => void sendInvite(channel)}\n onCopy={() => {\n if (inviteMessage) void services.link?.copy(inviteMessage);\n }}\n />\n </Shell>\n );\n }\n\n if (route === 'newGroup' || route === 'addParticipants') {\n const adding = route === 'addParticipants';\n const existing = new Set((adding ? (activeConversation?.members ?? []) : []).map((m) => m.id));\n const candidates: GroupCandidate[] = contactMatches.onYantra\n .filter((c) => c.match?.userId && !existing.has(String(c.match.userId)))\n .map((c) => ({\n userId: String(c.match!.userId),\n displayName: c.match!.displayName || c.displayName,\n imageUri: c.imageUri ?? c.match?.picture ?? null,\n }));\n return (\n <Shell theme={theme} testID={testID}>\n <NewGroupScreen\n candidates={candidates}\n theme={theme}\n mode={adding ? 'add' : 'create'}\n onCancel={() => setRoute(adding ? 'info' : 'list')}\n onCreate={async (name, memberIds) => {\n if (adding) {\n if (!activeChannelId) return null;\n const id = await conversations.addGroupMembers(activeChannelId, memberIds);\n if (id) setRoute('info');\n return id;\n }\n const id = await conversations.createGroup(name, memberIds);\n if (id) openThread(id);\n return id;\n }}\n />\n </Shell>\n );\n }\n\n const listError = conversations.error === dismissedError ? null : conversations.error;\n return (\n <Shell theme={theme} testID={testID}>\n <ConversationListScreen\n conversations={conversations.conversations}\n loading={conversations.loading}\n refreshing={conversations.refreshing}\n error={listError}\n theme={theme}\n connectionState={services.gql.connectionState}\n canInvite\n onRefresh={() => {\n conversations.refresh();\n void contactMatches.refresh();\n }}\n onRetry={conversations.refresh}\n loadingMore={conversations.loadingMore}\n onLoadMore={conversations.loadMore}\n onOpen={openThread}\n onNewChat={() => setRoute('contacts')}\n onNewGroup={() => {\n void contactMatches.refresh();\n setRoute('newGroup');\n }}\n onOpenNotifications={() => {\n setNotificationsBack('list');\n setRoute('notifications');\n }}\n pushStatus={services.push?.status}\n onEnablePush={services.push ? () => services.push?.enable() : undefined}\n onDismissError={() => setDismissedError(conversations.error)}\n notice={inviteNotice}\n onDismissNotice={() => setInviteNotice(null)}\n mode={route === 'archived' ? 'archived' : 'chats'}\n archivedCount={conversations.conversations.filter((c) => c.archivedAt > 0).length}\n onOpenArchived={() => {\n setListRoute('archived');\n setRoute('archived');\n }}\n onOpenStarred={() => setRoute('starred')}\n onOpenBlocked={() => {\n setGalleryBack('list');\n setRoute('blocked');\n }}\n onBack={() => {\n setListRoute('list');\n setRoute('list');\n }}\n onSetListState={conversations.setListState}\n />\n </Shell>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center' },\n});\n\nexport default NativeChatExperience;\n"],"names":["_a","_b","_c","_d","link","id"],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import*as React from'react';import {StyleSheet,View,Pressable,Text,ActivityIndicator,TextInput,FlatList}from'react-native';import {SafeAreaView}from'react-native-safe-area-context';import {MaterialCommunityIcons}from'@expo/vector-icons';import {InlineBanner,Avatar,EmptyState}from'./ChatComponents.js';import {TapRow}from'./TapRow.js';const GROUP_MEMBER_LIMIT = 1024;
|
|
2
|
+
function NewGroupScreen({
|
|
3
|
+
candidates,
|
|
4
|
+
theme,
|
|
5
|
+
busy,
|
|
6
|
+
mode = "create",
|
|
7
|
+
onCancel,
|
|
8
|
+
onCreate
|
|
9
|
+
}) {
|
|
10
|
+
const adding = mode === "add";
|
|
11
|
+
const [name, setName] = React.useState("");
|
|
12
|
+
const [picked, setPicked] = React.useState([]);
|
|
13
|
+
const [query, setQuery] = React.useState("");
|
|
14
|
+
const [creating, setCreating] = React.useState(false);
|
|
15
|
+
const [error, setError] = React.useState(null);
|
|
16
|
+
const rows = React.useMemo(() => {
|
|
17
|
+
const q = query.trim().toLowerCase();
|
|
18
|
+
const seen = /* @__PURE__ */ new Set();
|
|
19
|
+
return candidates.filter((c) => {
|
|
20
|
+
if (!c.userId || seen.has(c.userId)) return false;
|
|
21
|
+
seen.add(c.userId);
|
|
22
|
+
return !q || c.displayName.toLowerCase().includes(q);
|
|
23
|
+
});
|
|
24
|
+
}, [candidates, query]);
|
|
25
|
+
const toggle = (id) => {
|
|
26
|
+
setError(null);
|
|
27
|
+
setPicked((prev) => {
|
|
28
|
+
if (prev.includes(id)) return prev.filter((p) => p !== id);
|
|
29
|
+
if (prev.length >= GROUP_MEMBER_LIMIT) {
|
|
30
|
+
setError(`A group can have up to ${GROUP_MEMBER_LIMIT} members.`);
|
|
31
|
+
return prev;
|
|
32
|
+
}
|
|
33
|
+
return [...prev, id];
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const canCreate = (adding || name.trim().length > 0) && picked.length > 0 && !creating && !busy;
|
|
37
|
+
const create = async () => {
|
|
38
|
+
if (!canCreate) return;
|
|
39
|
+
setCreating(true);
|
|
40
|
+
setError(null);
|
|
41
|
+
try {
|
|
42
|
+
const id = await onCreate(name.trim(), picked);
|
|
43
|
+
if (!id) setError(adding ? "Could not add members. Please try again." : "Could not create the group. Please try again.");
|
|
44
|
+
} finally {
|
|
45
|
+
setCreating(false);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.fill, {
|
|
49
|
+
backgroundColor: theme.bg
|
|
50
|
+
}], testID: "chat-new-group", children: [
|
|
51
|
+
/* @__PURE__ */ jsx(SafeAreaView, { edges: ["top"], style: {
|
|
52
|
+
backgroundColor: theme.headerBg
|
|
53
|
+
}, children: /* @__PURE__ */ jsxs(View, { style: [styles.header, {
|
|
54
|
+
borderBottomColor: theme.border,
|
|
55
|
+
flexDirection: "row"
|
|
56
|
+
}], children: [
|
|
57
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: onCancel, hitSlop: 10, accessibilityRole: "button", style: styles.headerSide, children: /* @__PURE__ */ jsx(Text, { style: {
|
|
58
|
+
color: theme.accent,
|
|
59
|
+
fontSize: 17
|
|
60
|
+
}, children: "Cancel" }) }),
|
|
61
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
62
|
+
color: theme.text
|
|
63
|
+
}], children: adding ? "Add members" : "New group" }),
|
|
64
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: create, disabled: !canCreate, hitSlop: 10, accessibilityRole: "button", accessibilityLabel: adding ? "Add members" : "Create group", style: [styles.headerSide, styles.headerRight], testID: "chat-new-group-create", children: creating ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: theme.accent }) : /* @__PURE__ */ jsx(Text, { style: {
|
|
65
|
+
color: canCreate ? theme.accent : theme.textMuted,
|
|
66
|
+
fontSize: 17,
|
|
67
|
+
fontWeight: "600"
|
|
68
|
+
}, children: adding ? "Add" : "Create" }) })
|
|
69
|
+
] }) }),
|
|
70
|
+
/* @__PURE__ */ jsx(InlineBanner, { message: error, theme, onDismiss: () => setError(null) }),
|
|
71
|
+
adding ? null : /* @__PURE__ */ jsxs(View, { style: [styles.nameRow, {
|
|
72
|
+
backgroundColor: theme.surface,
|
|
73
|
+
flexDirection: "row"
|
|
74
|
+
}], children: [
|
|
75
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "account-group", size: 22, color: theme.textMuted }),
|
|
76
|
+
/* @__PURE__ */ jsx(TextInput, { value: name, onChangeText: (t) => setName(t.slice(0, 100)), placeholder: "Group name", placeholderTextColor: theme.textMuted, style: [styles.nameInput, {
|
|
77
|
+
color: theme.text
|
|
78
|
+
}], testID: "chat-new-group-name" })
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ jsxs(View, { style: [styles.search, {
|
|
81
|
+
backgroundColor: theme.surface,
|
|
82
|
+
flexDirection: "row"
|
|
83
|
+
}], children: [
|
|
84
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "magnify", size: 20, color: theme.textMuted }),
|
|
85
|
+
/* @__PURE__ */ jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Search contacts", placeholderTextColor: theme.textMuted, style: [styles.searchInput, {
|
|
86
|
+
color: theme.text
|
|
87
|
+
}], testID: "chat-new-group-search" })
|
|
88
|
+
] }),
|
|
89
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.count, {
|
|
90
|
+
color: theme.textMuted
|
|
91
|
+
}], children: picked.length ? `${picked.length} selected` : "Add members" }),
|
|
92
|
+
/* @__PURE__ */ jsx(FlatList, { data: rows, keyExtractor: (c) => c.userId, keyboardShouldPersistTaps: "handled", ListEmptyComponent: /* @__PURE__ */ jsx(EmptyState, { icon: "account-group-outline", title: "No contacts yet", detail: "People on Yantra Chat appear here. Invite friends from a new chat.", theme }), renderItem: ({
|
|
93
|
+
item
|
|
94
|
+
}) => {
|
|
95
|
+
const on = picked.includes(item.userId);
|
|
96
|
+
return /* @__PURE__ */ jsx(TapRow, { onPress: () => toggle(item.userId), accessibilityRole: "checkbox", accessibilityState: {
|
|
97
|
+
checked: on
|
|
98
|
+
}, accessibilityLabel: item.displayName, pressedColor: theme.surface, testID: `chat-new-group-${item.userId}`, children: /* @__PURE__ */ jsxs(View, { style: [styles.row, {
|
|
99
|
+
flexDirection: "row"
|
|
100
|
+
}], children: [
|
|
101
|
+
/* @__PURE__ */ jsx(View, { style: [styles.check, on ? {
|
|
102
|
+
backgroundColor: theme.accent,
|
|
103
|
+
borderColor: theme.accent
|
|
104
|
+
} : {
|
|
105
|
+
borderColor: theme.textMuted
|
|
106
|
+
}], children: on ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 16, color: theme.onAccent }) : null }),
|
|
107
|
+
/* @__PURE__ */ jsx(Avatar, { name: item.displayName, uri: item.imageUri, theme, size: 44, variant: "initials" }),
|
|
108
|
+
/* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.rowTitle, {
|
|
109
|
+
color: theme.text
|
|
110
|
+
}], children: item.displayName })
|
|
111
|
+
] }) });
|
|
112
|
+
} })
|
|
113
|
+
] });
|
|
114
|
+
}
|
|
115
|
+
const styles = StyleSheet.create({
|
|
116
|
+
fill: {
|
|
117
|
+
flex: 1
|
|
118
|
+
},
|
|
119
|
+
header: {
|
|
120
|
+
alignItems: "center",
|
|
121
|
+
justifyContent: "space-between",
|
|
122
|
+
paddingHorizontal: 12,
|
|
123
|
+
minHeight: 52,
|
|
124
|
+
borderBottomWidth: StyleSheet.hairlineWidth
|
|
125
|
+
},
|
|
126
|
+
headerSide: {
|
|
127
|
+
width: 72
|
|
128
|
+
},
|
|
129
|
+
headerRight: {
|
|
130
|
+
alignItems: "flex-end"
|
|
131
|
+
},
|
|
132
|
+
title: {
|
|
133
|
+
fontSize: 17,
|
|
134
|
+
fontWeight: "600"
|
|
135
|
+
},
|
|
136
|
+
nameRow: {
|
|
137
|
+
alignItems: "center",
|
|
138
|
+
margin: 12,
|
|
139
|
+
marginBottom: 6,
|
|
140
|
+
paddingHorizontal: 12,
|
|
141
|
+
height: 48,
|
|
142
|
+
borderRadius: 10
|
|
143
|
+
},
|
|
144
|
+
nameInput: {
|
|
145
|
+
flex: 1,
|
|
146
|
+
marginLeft: 10,
|
|
147
|
+
fontSize: 17,
|
|
148
|
+
paddingVertical: 0
|
|
149
|
+
},
|
|
150
|
+
search: {
|
|
151
|
+
alignItems: "center",
|
|
152
|
+
marginHorizontal: 12,
|
|
153
|
+
marginBottom: 4,
|
|
154
|
+
borderRadius: 10,
|
|
155
|
+
paddingHorizontal: 10,
|
|
156
|
+
height: 36
|
|
157
|
+
},
|
|
158
|
+
searchInput: {
|
|
159
|
+
flex: 1,
|
|
160
|
+
marginLeft: 8,
|
|
161
|
+
fontSize: 16,
|
|
162
|
+
paddingVertical: 0
|
|
163
|
+
},
|
|
164
|
+
count: {
|
|
165
|
+
fontSize: 12,
|
|
166
|
+
fontWeight: "600",
|
|
167
|
+
marginHorizontal: 18,
|
|
168
|
+
marginTop: 8,
|
|
169
|
+
marginBottom: 2,
|
|
170
|
+
textTransform: "uppercase"
|
|
171
|
+
},
|
|
172
|
+
row: {
|
|
173
|
+
alignItems: "center",
|
|
174
|
+
paddingHorizontal: 16,
|
|
175
|
+
paddingVertical: 8
|
|
176
|
+
},
|
|
177
|
+
check: {
|
|
178
|
+
width: 22,
|
|
179
|
+
height: 22,
|
|
180
|
+
borderRadius: 11,
|
|
181
|
+
borderWidth: 1.5,
|
|
182
|
+
alignItems: "center",
|
|
183
|
+
justifyContent: "center",
|
|
184
|
+
marginRight: 14
|
|
185
|
+
},
|
|
186
|
+
rowTitle: {
|
|
187
|
+
flex: 1,
|
|
188
|
+
fontSize: 17,
|
|
189
|
+
marginLeft: 12
|
|
190
|
+
}
|
|
191
|
+
});export{GROUP_MEMBER_LIMIT,NewGroupScreen};//# sourceMappingURL=NewGroupScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewGroupScreen.js","sources":["../../../src/features/messaging/NewGroupScreen.tsx"],"sourcesContent":["/**\n * \"New group\", WhatsApp-style: name the group and pick members from your Yantra contacts, then\n * create. The creator becomes the admin (server-side); on success the caller opens the new chat.\n */\nimport * as React from 'react';\nimport { ActivityIndicator, FlatList, Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Avatar, EmptyState, InlineBanner, type ChatTheme } from './ChatComponents';\nimport { TapRow } from './TapRow';\n\nexport interface GroupCandidate {\n userId: string;\n displayName: string;\n imageUri?: string | null;\n}\n\n/** WhatsApp caps a group at 1024 members; the picker enforces the same so create can't fail late. */\nexport const GROUP_MEMBER_LIMIT = 1024;\n\nexport function NewGroupScreen({\n candidates,\n theme,\n busy,\n mode = 'create',\n onCancel,\n onCreate,\n}: {\n candidates: GroupCandidate[];\n theme: ChatTheme;\n busy?: boolean;\n /** 'create' names a new group; 'add' adds members to an existing one (no name step). */\n mode?: 'create' | 'add';\n onCancel: () => void;\n /** Create the group (or add members); resolves a channel id / truthy, or null on failure. */\n onCreate: (name: string, memberIds: string[]) => Promise<string | null>;\n}) {\n const adding = mode === 'add';\n const [name, setName] = React.useState('');\n const [picked, setPicked] = React.useState<string[]>([]);\n const [query, setQuery] = React.useState('');\n const [creating, setCreating] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const rows = React.useMemo(() => {\n const q = query.trim().toLowerCase();\n const seen = new Set<string>();\n return candidates.filter((c) => {\n if (!c.userId || seen.has(c.userId)) return false;\n seen.add(c.userId);\n return !q || c.displayName.toLowerCase().includes(q);\n });\n }, [candidates, query]);\n\n const toggle = (id: string) => {\n setError(null);\n setPicked((prev) => {\n if (prev.includes(id)) return prev.filter((p) => p !== id);\n if (prev.length >= GROUP_MEMBER_LIMIT) {\n setError(`A group can have up to ${GROUP_MEMBER_LIMIT} members.`);\n return prev;\n }\n return [...prev, id];\n });\n };\n\n const canCreate = (adding || name.trim().length > 0) && picked.length > 0 && !creating && !busy;\n\n const create = async () => {\n if (!canCreate) return;\n setCreating(true);\n setError(null);\n try {\n const id = await onCreate(name.trim(), picked);\n if (!id)\n setError(\n adding\n ? 'Could not add members. Please try again.'\n : 'Could not create the group. Please try again.',\n );\n } finally {\n setCreating(false);\n }\n };\n\n return (\n <View style={[styles.fill, { backgroundColor: theme.bg }]} testID=\"chat-new-group\">\n <SafeAreaView edges={['top']} style={{ backgroundColor: theme.headerBg }}>\n <View style={[styles.header, { borderBottomColor: theme.border, flexDirection: 'row' }]}>\n <Pressable onPress={onCancel} hitSlop={10} accessibilityRole=\"button\" style={styles.headerSide}>\n <Text style={{ color: theme.accent, fontSize: 17 }}>Cancel</Text>\n </Pressable>\n <Text style={[styles.title, { color: theme.text }]}>{adding ? 'Add members' : 'New group'}</Text>\n <Pressable\n onPress={create}\n disabled={!canCreate}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel={adding ? 'Add members' : 'Create group'}\n style={[styles.headerSide, styles.headerRight]}\n testID=\"chat-new-group-create\"\n >\n {creating ? (\n <ActivityIndicator size=\"small\" color={theme.accent} />\n ) : (\n <Text\n style={{\n color: canCreate ? theme.accent : theme.textMuted,\n fontSize: 17,\n fontWeight: '600',\n }}\n >\n {adding ? 'Add' : 'Create'}\n </Text>\n )}\n </Pressable>\n </View>\n </SafeAreaView>\n <InlineBanner message={error} theme={theme} onDismiss={() => setError(null)} />\n {adding ? null : (\n <View style={[styles.nameRow, { backgroundColor: theme.surface, flexDirection: 'row' }]}>\n <MaterialCommunityIcons name=\"account-group\" size={22} color={theme.textMuted} />\n <TextInput\n value={name}\n onChangeText={(t) => setName(t.slice(0, 100))}\n placeholder=\"Group name\"\n placeholderTextColor={theme.textMuted}\n style={[styles.nameInput, { color: theme.text }]}\n testID=\"chat-new-group-name\"\n />\n </View>\n )}\n <View style={[styles.search, { backgroundColor: theme.surface, flexDirection: 'row' }]}>\n <MaterialCommunityIcons name=\"magnify\" size={20} color={theme.textMuted} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search contacts\"\n placeholderTextColor={theme.textMuted}\n style={[styles.searchInput, { color: theme.text }]}\n testID=\"chat-new-group-search\"\n />\n </View>\n <Text style={[styles.count, { color: theme.textMuted }]}>\n {picked.length ? `${picked.length} selected` : 'Add members'}\n </Text>\n <FlatList\n data={rows}\n keyExtractor={(c) => c.userId}\n keyboardShouldPersistTaps=\"handled\"\n ListEmptyComponent={\n <EmptyState\n icon=\"account-group-outline\"\n title=\"No contacts yet\"\n detail=\"People on Yantra Chat appear here. Invite friends from a new chat.\"\n theme={theme}\n />\n }\n renderItem={({ item }) => {\n const on = picked.includes(item.userId);\n return (\n <TapRow\n onPress={() => toggle(item.userId)}\n accessibilityRole=\"checkbox\"\n accessibilityState={{ checked: on }}\n accessibilityLabel={item.displayName}\n pressedColor={theme.surface}\n testID={`chat-new-group-${item.userId}`}\n >\n <View style={[styles.row, { flexDirection: 'row' }]}>\n <View\n style={[\n styles.check,\n on\n ? { backgroundColor: theme.accent, borderColor: theme.accent }\n : { borderColor: theme.textMuted },\n ]}\n >\n {on ? (\n <MaterialCommunityIcons name=\"check\" size={16} color={theme.onAccent} />\n ) : null}\n </View>\n <Avatar\n name={item.displayName}\n uri={item.imageUri}\n theme={theme}\n size={44}\n variant=\"initials\"\n />\n <Text numberOfLines={1} style={[styles.rowTitle, { color: theme.text }]}>\n {item.displayName}\n </Text>\n </View>\n </TapRow>\n );\n }}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n header: {\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 12,\n minHeight: 52,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headerSide: { width: 72 },\n headerRight: { alignItems: 'flex-end' },\n title: { fontSize: 17, fontWeight: '600' },\n nameRow: { alignItems: 'center', margin: 12, marginBottom: 6, paddingHorizontal: 12, height: 48, borderRadius: 10 },\n nameInput: { flex: 1, marginLeft: 10, fontSize: 17, paddingVertical: 0 },\n search: {\n alignItems: 'center',\n marginHorizontal: 12,\n marginBottom: 4,\n borderRadius: 10,\n paddingHorizontal: 10,\n height: 36,\n },\n searchInput: { flex: 1, marginLeft: 8, fontSize: 16, paddingVertical: 0 },\n count: {\n fontSize: 12,\n fontWeight: '600',\n marginHorizontal: 18,\n marginTop: 8,\n marginBottom: 2,\n textTransform: 'uppercase',\n },\n row: { alignItems: 'center', paddingHorizontal: 16, paddingVertical: 8 },\n check: {\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 14,\n },\n rowTitle: { flex: 1, fontSize: 17, marginLeft: 12 },\n});\n"],"names":[],"mappings":"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"}
|