@planningcenter/chat-react-native 4.2.1-qa-staging.3 → 4.2.1-qa-staging.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/build/contexts/api_provider.d.ts.map +1 -1
  2. package/build/contexts/api_provider.js +2 -1
  3. package/build/contexts/api_provider.js.map +1 -1
  4. package/build/hooks/use_fetch_newer_messages.d.ts +2 -1
  5. package/build/hooks/use_fetch_newer_messages.d.ts.map +1 -1
  6. package/build/hooks/use_fetch_newer_messages.js +16 -9
  7. package/build/hooks/use_fetch_newer_messages.js.map +1 -1
  8. package/build/screens/conversation_screen.d.ts.map +1 -1
  9. package/build/screens/conversation_screen.js +286 -274
  10. package/build/screens/conversation_screen.js.map +1 -1
  11. package/build/utils/cache/invalidate_refetchable_queries.d.ts +3 -0
  12. package/build/utils/cache/invalidate_refetchable_queries.d.ts.map +1 -0
  13. package/build/utils/cache/invalidate_refetchable_queries.js +8 -0
  14. package/build/utils/cache/invalidate_refetchable_queries.js.map +1 -0
  15. package/build/utils/cache/messages_cache.d.ts +1 -0
  16. package/build/utils/cache/messages_cache.d.ts.map +1 -1
  17. package/build/utils/cache/messages_cache.js +3 -0
  18. package/build/utils/cache/messages_cache.js.map +1 -1
  19. package/package.json +3 -3
  20. package/src/contexts/api_provider.tsx +2 -1
  21. package/src/hooks/__tests__/use_fetch_newer_messages.test.tsx +27 -0
  22. package/src/hooks/use_fetch_newer_messages.ts +11 -3
  23. package/src/screens/conversation_screen.tsx +8 -2
  24. package/src/utils/cache/__tests__/invalidate_refetchable_queries.test.ts +23 -0
  25. package/src/utils/cache/__tests__/messages_cache.test.ts +14 -1
  26. package/src/utils/cache/invalidate_refetchable_queries.ts +9 -0
  27. package/src/utils/cache/messages_cache.ts +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"conversation_screen.js","names":["HeaderTitle","PlatformPressable","CommonActions","useNavigation","useTheme","useNavigationTheme","useRoute","React","startTransition","useCallback","useEffect","useRef","useState","Platform","StyleSheet","useWindowDimensions","View","useSafeAreaInsets","Badge","Icon","AnchorNotFoundBoundary","ConversationStartBanner","JumpToBottomButton","MessageForm","MessageList","ConversationDisabledBanner","LeaderMessagesDisabledBanner","MemberMessagesDisabledBanner","TypingIndicator","KeyboardView","useHeaderSlotReserve","BlankState","ConversationContextProvider","useMessageAvailableMembersAction","useConversation","useConversationJoltEvents","useConversationMessages","useConversationMessagesJoltEvents","useFetchNewerMessages","useFetchNewerOnForeground","useHeldBackMessages","useMarkLatestMessageRead","analyticsEvents","normalizeAnalyticsMetadata","usePublishProductAnalyticsEvent","useRestAwayFromDismissEdge","useVideoModerationJoltEvents","gatedMessageCache","getMessagesQueryKey","decodeUlidTime","jsx","_jsx","jsxs","_jsxs","ConversationScreen","t0","$","_c","route","conversation_id","reply_root_id","initial_message_id","params","t1","data","conversation","t2","lastMessageCreatedAt","isBeforeLatestMessage","anchor","setAnchor","t3","Symbol","for","exitAnchoredMode","t4","dropAnchor","t5","t6","conversation_show_opened","t7","t8","t9","children","ConversationScreenContent","t10","currentPageReplyRootId","messagesQueryKey","onExitAnchoredMode","styles","useStyles","navigation","editing_message_id","reply_root_author_name","anchored","messages","fetchNextPage","hasNextPage","fetchPreviousPage","hasPreviousPage","isFetchingPreviousPage","queryKey","behindLatest","caughtUp","showJumpToBottomButton","setShowJumpToBottomButton","readingHistory","newestMessageId","id","fetchNewer","onSkippedNewMessage","conversationId","acceptNewMessages","replyRootId","messageCache","markHandledByMessageForm","useEnsureConversationsRouteExists","enabled","t11","t12","noMessages","length","repliesDisabled","memberAbility","badges","title","canReply","showLeaderDisabledReplyBanner","t13","t14","m","String","find","currentlyEditingMessage","split","replyRootAuthorFirstName","replyHeaderTitle","muted","conversationMembership","listRef","hasDragged","setHasDragged","holdListPosition","t15","OS","restOffset","onLayout","onContentSizeChange","onMomentumScrollEnd","onScrollEndDrag","t16","current","scrollToOffset","offset","handleReturnToBottom","t17","t18","jumpToLatest","t19","event","offsetY","nativeEvent","contentOffset","y","trackScroll","t20","loadNewerMessages","t21","deleted","setParams","badge","t22","t23","t24","Imagery","name","t25","Content","Heading","t26","goBack","Root","Button","onPress","accessibilityHint","accessibilityRole","t27","container","style","emptyState","hasMessages","onEndReached","onScrollBeginDrag","undefined","onStartReached","onStartReachedThreshold","maintainVisibleContentPosition","minIndexForVisible","visible","t28","t29","ConversationBottomBar","t30","t31","onFlaggedInMessageForm","onBeforeSubmit","messageLink","disabled","disabledMessage","message","AttachmentPicker","Commands","TextInput","SubmitButton","latestMessageCreatedAt","Date","parse","ConversationScreenTitle","usePressableHeaderStyle","resourceType","pcoResourceType","productName","appName","text","navigate","maxFontSizeMultiplier","titleTextContainer","size","titleWrapper","variant","testID","width","slotReserve","headerContainerStyle","maxWidth","create","alignItems","select","android","default","flex","columnGap","flexDirection","flexShrink","minWidth","alignSelf","marginTop","navigationTheme","bottom","colors","card","justifyContent","backgroundColor","paddingBottom","chat_group_graph_id","navigationState","getState","routes","conversationsRoute","_temp","dispatch","state","reset","index","r"],"sources":["../../src/screens/conversation_screen.tsx"],"sourcesContent":["import { HeaderTitle, HeaderTitleProps, PlatformPressable } from '@react-navigation/elements'\nimport {\n CommonActions,\n RouteProp,\n StaticScreenProps,\n useNavigation,\n useTheme as useNavigationTheme,\n useRoute,\n} from '@react-navigation/native'\nimport React, { startTransition, useCallback, useEffect, useRef, useState } from 'react'\nimport { FlatList, Platform, StyleSheet, useWindowDimensions, View } from 'react-native'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { Badge, Icon } from '../components'\nimport { AnchorNotFoundBoundary } from '../components/conversation/anchor_not_found_boundary'\nimport { ConversationStartBanner } from '../components/conversation/conversation_start_banner'\nimport { JumpToBottomButton } from '../components/conversation/jump_to_bottom_button'\nimport { MessageForm } from '../components/conversation/message_form'\nimport { MessageList } from '../components/conversation/message_list'\nimport {\n ConversationDisabledBanner,\n LeaderMessagesDisabledBanner,\n MemberMessagesDisabledBanner,\n} from '../components/conversation/messages_disabled_banners'\nimport { TypingIndicator } from '../components/conversation/typing_indicator'\nimport { KeyboardView } from '../components/display/keyboard_view'\nimport { useHeaderSlotReserve } from '../components/display/platform_modal_header_buttons'\nimport BlankState from '../components/primitive/blank_state_primitive'\nimport { ConversationContextProvider } from '../contexts/conversation_context'\nimport { useMessageAvailableMembersAction } from '../hooks/direct_messages/use_message_available_members_action'\nimport { useConversation } from '../hooks/use_conversation'\nimport { useConversationJoltEvents } from '../hooks/use_conversation_jolt_events'\nimport { useConversationMessages } from '../hooks/use_conversation_messages'\nimport { useConversationMessagesJoltEvents } from '../hooks/use_conversation_messages_jolt_events'\nimport { useFetchNewerMessages } from '../hooks/use_fetch_newer_messages'\nimport { useFetchNewerOnForeground } from '../hooks/use_fetch_newer_on_foreground'\nimport { useHeldBackMessages } from '../hooks/use_held_back_messages'\nimport { useMarkLatestMessageRead } from '../hooks/use_mark_latest_message_read'\nimport {\n analyticsEvents,\n normalizeAnalyticsMetadata,\n usePublishProductAnalyticsEvent,\n} from '../hooks/use_product_analytics'\nimport { useRestAwayFromDismissEdge } from '../hooks/use_rest_away_from_dismiss_edge'\nimport { useVideoModerationJoltEvents } from '../hooks/use_video_moderation_jolt_events'\nimport { ConversationResource } from '../types/resources/conversation'\nimport { ConversationBadgeResource } from '../types/resources/conversation_badge'\nimport { MessageResource } from '../types/resources/message'\nimport { gatedMessageCache } from '../utils/gated_message_cache'\nimport { getMessagesQueryKey } from '../utils/request/get_messages'\nimport { decodeUlidTime } from '../utils/ulid'\n\nexport type ConversationRouteProps = {\n conversation_id: number\n reply_root_id?: string | null\n reply_root_author_name?: string\n chat_group_graph_id?: string\n clear_input?: boolean\n editing_message_id?: number | null\n initial_message_id?: string | null\n title?: string\n subtitle?: string\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport type ConversationScreenProps = StaticScreenProps<ConversationRouteProps>\n\nexport function ConversationScreen({ route }: ConversationScreenProps) {\n const { conversation_id, reply_root_id, initial_message_id } = route.params\n\n const { data: conversation } = useConversation({ conversation_id })\n const [anchor, setAnchor] = useState(() =>\n isBeforeLatestMessage(initial_message_id, conversation?.lastMessageCreatedAt)\n ? initial_message_id\n : null\n )\n const exitAnchoredMode = useCallback(() => startTransition(() => setAnchor(null)), [])\n const dropAnchor = useCallback(() => setAnchor(null), [])\n\n usePublishProductAnalyticsEvent(analyticsEvents.conversation_show_opened, {\n reply_root_id,\n ...normalizeAnalyticsMetadata(conversation),\n })\n\n return (\n <ConversationContextProvider\n conversationId={conversation_id}\n currentPageReplyRootId={reply_root_id ?? null}\n messagesQueryKey={getMessagesQueryKey({ conversation_id, reply_root_id, anchor })}\n >\n {anchor ? (\n <AnchorNotFoundBoundary onAnchorNotFound={dropAnchor}>\n <ConversationScreenContent\n route={route}\n anchor={anchor}\n onExitAnchoredMode={exitAnchoredMode}\n />\n </AnchorNotFoundBoundary>\n ) : (\n <ConversationScreenContent\n route={route}\n anchor={null}\n onExitAnchoredMode={exitAnchoredMode}\n />\n )}\n </ConversationContextProvider>\n )\n}\n\ninterface ConversationScreenContentProps extends ConversationScreenProps {\n anchor: string | null | undefined\n onExitAnchoredMode: () => void\n}\n\nfunction ConversationScreenContent({\n route,\n anchor,\n onExitAnchoredMode,\n}: ConversationScreenContentProps) {\n const styles = useStyles()\n const navigation = useNavigation()\n const { conversation_id, editing_message_id, reply_root_id, reply_root_author_name } =\n route.params\n const { data: conversation } = useConversation(route.params)\n const anchored = !!anchor\n const {\n messages,\n fetchNextPage,\n hasNextPage,\n fetchPreviousPage,\n hasPreviousPage,\n isFetchingPreviousPage,\n queryKey,\n } = useConversationMessages({ conversation_id, reply_root_id, anchor })\n const behindLatest = anchored && hasPreviousPage\n const caughtUp = !hasPreviousPage\n const [showJumpToBottomButton, setShowJumpToBottomButton] = useState(false)\n const readingHistory = showJumpToBottomButton\n const newestMessageId = messages[0]?.id\n const fetchNewer = useFetchNewerMessages({ conversation_id, reply_root_id, queryKey })\n const { onSkippedNewMessage } = useHeldBackMessages({\n fetchNewer,\n newestMessageId,\n readingHistory,\n caughtUp,\n })\n useConversationJoltEvents({ conversationId: conversation_id })\n useConversationMessagesJoltEvents({\n conversationId: conversation_id,\n replyRootId: reply_root_id ?? null,\n messageCache: gatedMessageCache({\n queryKey,\n acceptNewMessages: caughtUp && !readingHistory,\n onSkippedNewMessage,\n }),\n })\n const { markHandledByMessageForm } = useVideoModerationJoltEvents()\n useEnsureConversationsRouteExists()\n useMarkLatestMessageRead({ conversation, messages, enabled: !behindLatest })\n useFetchNewerOnForeground({ fetchNewer, newestMessageId, enabled: anchored && caughtUp })\n const noMessages = messages.length === 0\n\n const { repliesDisabled, memberAbility, badges, title } = conversation\n const canReply = memberAbility?.canReply\n const showLeaderDisabledReplyBanner = canReply && repliesDisabled\n const currentlyEditingMessage = messages.find(m => String(m.id) === String(editing_message_id))\n const replyRootAuthorFirstName = reply_root_author_name?.split(' ')[0]\n const replyHeaderTitle = replyRootAuthorFirstName\n ? `Reply to ${replyRootAuthorFirstName}`\n : 'Reply'\n // Prefer the membership for optimistic updates.\n const muted = conversation.conversationMembership?.muted ?? conversation.muted\n\n const listRef = useRef<FlatList>(null)\n const [hasDragged, setHasDragged] = useState(false)\n const holdListPosition = behindLatest || readingHistory\n\n const { restOffset, onLayout, onContentSizeChange, onMomentumScrollEnd, onScrollEndDrag } =\n useRestAwayFromDismissEdge({\n listRef,\n enabled: Platform.OS === 'ios',\n })\n\n const handleReturnToBottom = useCallback(() => {\n listRef.current?.scrollToOffset({\n offset: restOffset,\n })\n }, [restOffset])\n\n const exitAnchoredMode = useCallback(() => {\n onExitAnchoredMode()\n handleReturnToBottom()\n }, [handleReturnToBottom, onExitAnchoredMode])\n const jumpToLatest = useCallback(() => {\n setShowJumpToBottomButton(false)\n if (anchored) exitAnchoredMode()\n else handleReturnToBottom()\n }, [anchored, exitAnchoredMode, handleReturnToBottom])\n\n const trackScroll = (event: any) => {\n const offsetY = event.nativeEvent.contentOffset.y\n setShowJumpToBottomButton(offsetY > 200)\n }\n\n const loadNewerMessages = () => {\n if (!hasPreviousPage || isFetchingPreviousPage) return\n\n setHasDragged(false)\n fetchPreviousPage()\n }\n\n useEffect(() => {\n if (reply_root_id) {\n navigation.setParams({\n title: replyHeaderTitle,\n })\n } else {\n navigation.setParams({\n title: title,\n badge: badges?.[0],\n deleted: conversation?.deleted,\n muted,\n })\n }\n }, [navigation, title, badges, conversation?.deleted, reply_root_id, replyHeaderTitle, muted])\n\n if (!conversation || conversation.deleted) {\n return (\n <View style={styles.container}>\n <BlankState.Root>\n <BlankState.Imagery name=\"general.outlinedTextMessage\" />\n <BlankState.Content>\n <BlankState.Heading>This conversation has been deleted</BlankState.Heading>\n </BlankState.Content>\n <BlankState.Button\n onPress={navigation.goBack}\n title=\"Back to conversations\"\n accessibilityHint=\"Navigates back to the conversations list\"\n accessibilityRole=\"link\"\n />\n </BlankState.Root>\n </View>\n )\n }\n\n return (\n <View style={styles.container}>\n <KeyboardView>\n {noMessages ? (\n <View style={styles.emptyState}>\n <ConversationStartBanner conversation={conversation} hasMessages={false} />\n </View>\n ) : (\n <MessageList\n listRef={listRef}\n conversation={conversation}\n conversationId={conversation_id}\n messages={messages}\n replyRootId={reply_root_id}\n anchorMessageId={anchor}\n hasNextPage={hasNextPage}\n onEndReached={() => fetchNextPage()}\n onScroll={trackScroll}\n onLayout={onLayout}\n onContentSizeChange={onContentSizeChange}\n onScrollEndDrag={onScrollEndDrag}\n onMomentumScrollEnd={onMomentumScrollEnd}\n onScrollBeginDrag={anchored ? () => setHasDragged(true) : undefined}\n onStartReached={anchored && hasDragged ? loadNewerMessages : undefined}\n onStartReachedThreshold={anchored ? 0.5 : undefined}\n maintainVisibleContentPosition={\n holdListPosition ? { minIndexForVisible: 0 } : undefined\n }\n />\n )}\n <JumpToBottomButton\n onPress={jumpToLatest}\n visible={behindLatest || showJumpToBottomButton}\n />\n {!noMessages && <TypingIndicator />}\n {showLeaderDisabledReplyBanner && <LeaderMessagesDisabledBanner />}\n <ConversationBottomBar\n conversation={conversation}\n canReply={canReply}\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n replyRootId={reply_root_id}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={markHandledByMessageForm}\n onBeforeSubmit={jumpToLatest}\n />\n </KeyboardView>\n </View>\n )\n}\n\ninterface ConversationBottomBarProps {\n conversation: ConversationResource\n canReply: boolean | undefined\n replyRootAuthorFirstName: string | undefined\n replyRootId: string | null | undefined\n currentlyEditingMessage: MessageResource | undefined\n onFlaggedInMessageForm?: (id: string) => void\n onBeforeSubmit?: () => void\n}\n\nfunction ConversationBottomBar({\n conversation,\n canReply,\n replyRootAuthorFirstName,\n replyRootId,\n currentlyEditingMessage,\n onFlaggedInMessageForm,\n onBeforeSubmit,\n}: ConversationBottomBarProps) {\n const messageLink = useMessageAvailableMembersAction(conversation)\n\n if (conversation.disabled)\n return (\n <ConversationDisabledBanner\n message={conversation.disabledMessage ?? null}\n messageLink={messageLink}\n />\n )\n if (!canReply) return <MemberMessagesDisabledBanner />\n return (\n <MessageForm.Root\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n conversation={conversation}\n replyRootId={replyRootId}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={onFlaggedInMessageForm}\n onBeforeSubmit={onBeforeSubmit}\n key={\n currentlyEditingMessage\n ? `edit-message-form-${currentlyEditingMessage.id}`\n : 'new-message-form'\n }\n >\n <MessageForm.AttachmentPicker />\n <MessageForm.Commands />\n <MessageForm.TextInput />\n <MessageForm.SubmitButton />\n </MessageForm.Root>\n )\n}\n\nconst isBeforeLatestMessage = (anchor?: string | null, latestMessageCreatedAt?: string) =>\n !!anchor &&\n !!latestMessageCreatedAt &&\n decodeUlidTime(anchor) < Date.parse(latestMessageCreatedAt)\n\ninterface ConversationScreenTitleProps extends HeaderTitleProps {\n conversation_id: number\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport const ConversationScreenTitle = ({\n conversation_id,\n badge,\n children,\n style,\n deleted,\n muted,\n}: ConversationScreenTitleProps) => {\n const styles = usePressableHeaderStyle()\n const navigation = useNavigation()\n const resourceType = badge?.pcoResourceType || ''\n const productName = badge?.appName\n const name = badge?.text || undefined\n\n return (\n <PlatformPressable\n testID=\"conversation-details-button\"\n accessibilityHint=\"Opens details about members and settings\"\n style={styles.container}\n onPress={() => {\n if (deleted) return\n\n navigation.navigate('ConversationDetails', { conversation_id })\n }}\n >\n <View style={styles.titleWrapper}>\n <View style={styles.titleTextContainer}>\n <HeaderTitle maxFontSizeMultiplier={1} style={style}>\n {children}\n </HeaderTitle>\n </View>\n {muted && <Icon name=\"general.bellMuted\" size={12} />}\n {!deleted && <Icon name=\"general.downChevron\" size={12} />}\n </View>\n <Badge\n variant=\"metaSubtle\"\n productLogoName={productName}\n label={resourceType}\n metaLabel={name}\n style={styles.badge}\n maxFontSizeMultiplier={1}\n />\n </PlatformPressable>\n )\n}\n\nconst usePressableHeaderStyle = () => {\n const { width } = useWindowDimensions()\n const slotReserve = useHeaderSlotReserve()\n const headerContainerStyle = { maxWidth: width - slotReserve * 2 }\n\n return StyleSheet.create({\n container: {\n alignItems: Platform.select({ android: 'flex-start', default: 'center' }),\n flex: 1,\n ...headerContainerStyle,\n },\n titleWrapper: {\n alignItems: 'center',\n columnGap: 4,\n flexDirection: 'row',\n flexShrink: 1,\n },\n titleTextContainer: {\n flexShrink: 1,\n minWidth: 0,\n },\n badge: {\n alignSelf: Platform.select({ android: 'flex-start', default: 'center' }),\n marginTop: 2,\n },\n })\n}\n\nconst useStyles = () => {\n const navigationTheme = useNavigationTheme()\n const { bottom } = useSafeAreaInsets()\n\n return StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n backgroundColor: navigationTheme.colors.card,\n paddingBottom: bottom,\n },\n emptyState: {\n flex: 1,\n justifyContent: 'center',\n },\n })\n}\n\n/**\n * useEnsureConversationsRouteExists\n */\nconst useEnsureConversationsRouteExists = () => {\n const navigation = useNavigation()\n const { params } = useRoute<RouteProp<ConversationScreenProps['route']>>()\n\n useEffect(() => {\n const navigationState = navigation.getState()\n const routes = navigationState?.routes || []\n const conversationsRoute = routes.find(r => r.name === 'Conversations')\n\n if (conversationsRoute) return\n\n navigation.dispatch(state => {\n return CommonActions.reset({\n ...state,\n routes: [\n { name: 'Conversations', params: { chat_group_graph_id: params?.chat_group_graph_id } },\n ...routes,\n ],\n index: state.index + 1,\n })\n })\n }, [navigation, params?.chat_group_graph_id])\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"conversation_screen.js","names":["HeaderTitle","PlatformPressable","CommonActions","useNavigation","useTheme","useNavigationTheme","useRoute","React","startTransition","useCallback","useEffect","useRef","useState","Platform","StyleSheet","useWindowDimensions","View","useSafeAreaInsets","Badge","Icon","AnchorNotFoundBoundary","ConversationStartBanner","JumpToBottomButton","MessageForm","MessageList","ConversationDisabledBanner","LeaderMessagesDisabledBanner","MemberMessagesDisabledBanner","TypingIndicator","KeyboardView","useHeaderSlotReserve","BlankState","ConversationContextProvider","useMessageAvailableMembersAction","useConversation","useConversationJoltEvents","useConversationMessages","useConversationMessagesJoltEvents","useFetchNewerMessages","useFetchNewerOnForeground","useHeldBackMessages","useMarkLatestMessageRead","analyticsEvents","normalizeAnalyticsMetadata","usePublishProductAnalyticsEvent","useRestAwayFromDismissEdge","useVideoModerationJoltEvents","newestPersistedMessageId","gatedMessageCache","getMessagesQueryKey","decodeUlidTime","jsx","_jsx","jsxs","_jsxs","ConversationScreen","t0","$","_c","route","conversation_id","reply_root_id","initial_message_id","params","t1","data","conversation","t2","lastMessageCreatedAt","isBeforeLatestMessage","anchor","setAnchor","t3","Symbol","for","exitAnchoredMode","t4","dropAnchor","t5","t6","conversation_show_opened","t7","t8","t9","children","ConversationScreenContent","t10","currentPageReplyRootId","messagesQueryKey","onExitAnchoredMode","styles","useStyles","navigation","editing_message_id","reply_root_author_name","anchored","messages","fetchNextPage","hasNextPage","fetchPreviousPage","hasPreviousPage","isFetchingPreviousPage","queryKey","behindLatest","caughtUp","showJumpToBottomButton","setShowJumpToBottomButton","readingHistory","newestMessageId","undefined","onTooFarBehind","fetchNewer","onSkippedNewMessage","conversationId","acceptNewMessages","replyRootId","messageCache","markHandledByMessageForm","useEnsureConversationsRouteExists","t11","t12","enabled","t13","t14","noMessages","length","repliesDisabled","memberAbility","badges","title","canReply","showLeaderDisabledReplyBanner","t15","t16","m","String","id","find","currentlyEditingMessage","split","replyRootAuthorFirstName","replyHeaderTitle","muted","conversationMembership","listRef","hasDragged","setHasDragged","holdListPosition","t17","OS","restOffset","onLayout","onContentSizeChange","onMomentumScrollEnd","onScrollEndDrag","t18","current","scrollToOffset","offset","handleReturnToBottom","t19","t20","jumpToLatest","t21","event","offsetY","nativeEvent","contentOffset","y","trackScroll","t22","loadNewerMessages","t23","deleted","setParams","badge","t24","t25","t26","Imagery","name","t27","Content","Heading","t28","goBack","Root","Button","onPress","accessibilityHint","accessibilityRole","t29","container","style","emptyState","hasMessages","onEndReached","onScrollBeginDrag","onStartReached","onStartReachedThreshold","maintainVisibleContentPosition","minIndexForVisible","visible","t30","t31","ConversationBottomBar","t32","t33","onFlaggedInMessageForm","onBeforeSubmit","messageLink","disabled","disabledMessage","message","AttachmentPicker","Commands","TextInput","SubmitButton","latestMessageCreatedAt","Date","parse","ConversationScreenTitle","usePressableHeaderStyle","resourceType","pcoResourceType","productName","appName","text","navigate","maxFontSizeMultiplier","titleTextContainer","size","titleWrapper","variant","testID","width","slotReserve","headerContainerStyle","maxWidth","create","alignItems","select","android","default","flex","columnGap","flexDirection","flexShrink","minWidth","alignSelf","marginTop","navigationTheme","bottom","colors","card","justifyContent","backgroundColor","paddingBottom","chat_group_graph_id","navigationState","getState","routes","conversationsRoute","_temp","dispatch","state","reset","index","r"],"sources":["../../src/screens/conversation_screen.tsx"],"sourcesContent":["import { HeaderTitle, HeaderTitleProps, PlatformPressable } from '@react-navigation/elements'\nimport {\n CommonActions,\n RouteProp,\n StaticScreenProps,\n useNavigation,\n useTheme as useNavigationTheme,\n useRoute,\n} from '@react-navigation/native'\nimport React, { startTransition, useCallback, useEffect, useRef, useState } from 'react'\nimport { FlatList, Platform, StyleSheet, useWindowDimensions, View } from 'react-native'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\nimport { Badge, Icon } from '../components'\nimport { AnchorNotFoundBoundary } from '../components/conversation/anchor_not_found_boundary'\nimport { ConversationStartBanner } from '../components/conversation/conversation_start_banner'\nimport { JumpToBottomButton } from '../components/conversation/jump_to_bottom_button'\nimport { MessageForm } from '../components/conversation/message_form'\nimport { MessageList } from '../components/conversation/message_list'\nimport {\n ConversationDisabledBanner,\n LeaderMessagesDisabledBanner,\n MemberMessagesDisabledBanner,\n} from '../components/conversation/messages_disabled_banners'\nimport { TypingIndicator } from '../components/conversation/typing_indicator'\nimport { KeyboardView } from '../components/display/keyboard_view'\nimport { useHeaderSlotReserve } from '../components/display/platform_modal_header_buttons'\nimport BlankState from '../components/primitive/blank_state_primitive'\nimport { ConversationContextProvider } from '../contexts/conversation_context'\nimport { useMessageAvailableMembersAction } from '../hooks/direct_messages/use_message_available_members_action'\nimport { useConversation } from '../hooks/use_conversation'\nimport { useConversationJoltEvents } from '../hooks/use_conversation_jolt_events'\nimport { useConversationMessages } from '../hooks/use_conversation_messages'\nimport { useConversationMessagesJoltEvents } from '../hooks/use_conversation_messages_jolt_events'\nimport { useFetchNewerMessages } from '../hooks/use_fetch_newer_messages'\nimport { useFetchNewerOnForeground } from '../hooks/use_fetch_newer_on_foreground'\nimport { useHeldBackMessages } from '../hooks/use_held_back_messages'\nimport { useMarkLatestMessageRead } from '../hooks/use_mark_latest_message_read'\nimport {\n analyticsEvents,\n normalizeAnalyticsMetadata,\n usePublishProductAnalyticsEvent,\n} from '../hooks/use_product_analytics'\nimport { useRestAwayFromDismissEdge } from '../hooks/use_rest_away_from_dismiss_edge'\nimport { useVideoModerationJoltEvents } from '../hooks/use_video_moderation_jolt_events'\nimport { ConversationResource } from '../types/resources/conversation'\nimport { ConversationBadgeResource } from '../types/resources/conversation_badge'\nimport { MessageResource } from '../types/resources/message'\nimport { newestPersistedMessageId } from '../utils/cache/messages_cache'\nimport { gatedMessageCache } from '../utils/gated_message_cache'\nimport { getMessagesQueryKey } from '../utils/request/get_messages'\nimport { decodeUlidTime } from '../utils/ulid'\n\nexport type ConversationRouteProps = {\n conversation_id: number\n reply_root_id?: string | null\n reply_root_author_name?: string\n chat_group_graph_id?: string\n clear_input?: boolean\n editing_message_id?: number | null\n initial_message_id?: string | null\n title?: string\n subtitle?: string\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport type ConversationScreenProps = StaticScreenProps<ConversationRouteProps>\n\nexport function ConversationScreen({ route }: ConversationScreenProps) {\n const { conversation_id, reply_root_id, initial_message_id } = route.params\n\n const { data: conversation } = useConversation({ conversation_id })\n const [anchor, setAnchor] = useState(() =>\n isBeforeLatestMessage(initial_message_id, conversation?.lastMessageCreatedAt)\n ? initial_message_id\n : null\n )\n const exitAnchoredMode = useCallback(() => startTransition(() => setAnchor(null)), [])\n const dropAnchor = useCallback(() => setAnchor(null), [])\n\n usePublishProductAnalyticsEvent(analyticsEvents.conversation_show_opened, {\n reply_root_id,\n ...normalizeAnalyticsMetadata(conversation),\n })\n\n return (\n <ConversationContextProvider\n conversationId={conversation_id}\n currentPageReplyRootId={reply_root_id ?? null}\n messagesQueryKey={getMessagesQueryKey({ conversation_id, reply_root_id, anchor })}\n >\n {anchor ? (\n <AnchorNotFoundBoundary onAnchorNotFound={dropAnchor}>\n <ConversationScreenContent\n route={route}\n anchor={anchor}\n onExitAnchoredMode={exitAnchoredMode}\n />\n </AnchorNotFoundBoundary>\n ) : (\n <ConversationScreenContent\n route={route}\n anchor={null}\n onExitAnchoredMode={exitAnchoredMode}\n />\n )}\n </ConversationContextProvider>\n )\n}\n\ninterface ConversationScreenContentProps extends ConversationScreenProps {\n anchor: string | null | undefined\n onExitAnchoredMode: () => void\n}\n\nfunction ConversationScreenContent({\n route,\n anchor,\n onExitAnchoredMode,\n}: ConversationScreenContentProps) {\n const styles = useStyles()\n const navigation = useNavigation()\n const { conversation_id, editing_message_id, reply_root_id, reply_root_author_name } =\n route.params\n const { data: conversation } = useConversation(route.params)\n const anchored = !!anchor\n const {\n messages,\n fetchNextPage,\n hasNextPage,\n fetchPreviousPage,\n hasPreviousPage,\n isFetchingPreviousPage,\n queryKey,\n } = useConversationMessages({ conversation_id, reply_root_id, anchor })\n const behindLatest = anchored && hasPreviousPage\n const caughtUp = !hasPreviousPage\n const [showJumpToBottomButton, setShowJumpToBottomButton] = useState(false)\n const readingHistory = showJumpToBottomButton\n const newestMessageId = newestPersistedMessageId(messages)\n const fetchNewer = useFetchNewerMessages({\n conversation_id,\n reply_root_id,\n queryKey,\n onTooFarBehind: anchored ? onExitAnchoredMode : undefined,\n })\n const { onSkippedNewMessage } = useHeldBackMessages({\n fetchNewer,\n newestMessageId,\n readingHistory,\n caughtUp,\n })\n useConversationJoltEvents({ conversationId: conversation_id })\n useConversationMessagesJoltEvents({\n conversationId: conversation_id,\n replyRootId: reply_root_id ?? null,\n messageCache: gatedMessageCache({\n queryKey,\n acceptNewMessages: caughtUp && !readingHistory,\n onSkippedNewMessage,\n }),\n })\n const { markHandledByMessageForm } = useVideoModerationJoltEvents()\n useEnsureConversationsRouteExists()\n useMarkLatestMessageRead({ conversation, messages, enabled: !behindLatest })\n useFetchNewerOnForeground({ fetchNewer, newestMessageId, enabled: anchored && caughtUp })\n const noMessages = messages.length === 0\n\n const { repliesDisabled, memberAbility, badges, title } = conversation\n const canReply = memberAbility?.canReply\n const showLeaderDisabledReplyBanner = canReply && repliesDisabled\n const currentlyEditingMessage = messages.find(m => String(m.id) === String(editing_message_id))\n const replyRootAuthorFirstName = reply_root_author_name?.split(' ')[0]\n const replyHeaderTitle = replyRootAuthorFirstName\n ? `Reply to ${replyRootAuthorFirstName}`\n : 'Reply'\n // Prefer the membership for optimistic updates.\n const muted = conversation.conversationMembership?.muted ?? conversation.muted\n\n const listRef = useRef<FlatList>(null)\n const [hasDragged, setHasDragged] = useState(false)\n const holdListPosition = behindLatest || readingHistory\n\n const { restOffset, onLayout, onContentSizeChange, onMomentumScrollEnd, onScrollEndDrag } =\n useRestAwayFromDismissEdge({\n listRef,\n enabled: Platform.OS === 'ios',\n })\n\n const handleReturnToBottom = useCallback(() => {\n listRef.current?.scrollToOffset({\n offset: restOffset,\n })\n }, [restOffset])\n\n const exitAnchoredMode = useCallback(() => {\n onExitAnchoredMode()\n handleReturnToBottom()\n }, [handleReturnToBottom, onExitAnchoredMode])\n const jumpToLatest = useCallback(() => {\n setShowJumpToBottomButton(false)\n if (anchored) exitAnchoredMode()\n else handleReturnToBottom()\n }, [anchored, exitAnchoredMode, handleReturnToBottom])\n\n const trackScroll = (event: any) => {\n const offsetY = event.nativeEvent.contentOffset.y\n setShowJumpToBottomButton(offsetY > 200)\n }\n\n const loadNewerMessages = () => {\n if (!hasPreviousPage || isFetchingPreviousPage) return\n\n setHasDragged(false)\n fetchPreviousPage()\n }\n\n useEffect(() => {\n if (reply_root_id) {\n navigation.setParams({\n title: replyHeaderTitle,\n })\n } else {\n navigation.setParams({\n title: title,\n badge: badges?.[0],\n deleted: conversation?.deleted,\n muted,\n })\n }\n }, [navigation, title, badges, conversation?.deleted, reply_root_id, replyHeaderTitle, muted])\n\n if (!conversation || conversation.deleted) {\n return (\n <View style={styles.container}>\n <BlankState.Root>\n <BlankState.Imagery name=\"general.outlinedTextMessage\" />\n <BlankState.Content>\n <BlankState.Heading>This conversation has been deleted</BlankState.Heading>\n </BlankState.Content>\n <BlankState.Button\n onPress={navigation.goBack}\n title=\"Back to conversations\"\n accessibilityHint=\"Navigates back to the conversations list\"\n accessibilityRole=\"link\"\n />\n </BlankState.Root>\n </View>\n )\n }\n\n return (\n <View style={styles.container}>\n <KeyboardView>\n {noMessages ? (\n <View style={styles.emptyState}>\n <ConversationStartBanner conversation={conversation} hasMessages={false} />\n </View>\n ) : (\n <MessageList\n listRef={listRef}\n conversation={conversation}\n conversationId={conversation_id}\n messages={messages}\n replyRootId={reply_root_id}\n anchorMessageId={anchor}\n hasNextPage={hasNextPage}\n onEndReached={() => fetchNextPage()}\n onScroll={trackScroll}\n onLayout={onLayout}\n onContentSizeChange={onContentSizeChange}\n onScrollEndDrag={onScrollEndDrag}\n onMomentumScrollEnd={onMomentumScrollEnd}\n onScrollBeginDrag={anchored ? () => setHasDragged(true) : undefined}\n onStartReached={anchored && hasDragged ? loadNewerMessages : undefined}\n onStartReachedThreshold={anchored ? 0.5 : undefined}\n maintainVisibleContentPosition={\n holdListPosition ? { minIndexForVisible: 0 } : undefined\n }\n />\n )}\n <JumpToBottomButton\n onPress={jumpToLatest}\n visible={behindLatest || showJumpToBottomButton}\n />\n {!noMessages && <TypingIndicator />}\n {showLeaderDisabledReplyBanner && <LeaderMessagesDisabledBanner />}\n <ConversationBottomBar\n conversation={conversation}\n canReply={canReply}\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n replyRootId={reply_root_id}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={markHandledByMessageForm}\n onBeforeSubmit={jumpToLatest}\n />\n </KeyboardView>\n </View>\n )\n}\n\ninterface ConversationBottomBarProps {\n conversation: ConversationResource\n canReply: boolean | undefined\n replyRootAuthorFirstName: string | undefined\n replyRootId: string | null | undefined\n currentlyEditingMessage: MessageResource | undefined\n onFlaggedInMessageForm?: (id: string) => void\n onBeforeSubmit?: () => void\n}\n\nfunction ConversationBottomBar({\n conversation,\n canReply,\n replyRootAuthorFirstName,\n replyRootId,\n currentlyEditingMessage,\n onFlaggedInMessageForm,\n onBeforeSubmit,\n}: ConversationBottomBarProps) {\n const messageLink = useMessageAvailableMembersAction(conversation)\n\n if (conversation.disabled)\n return (\n <ConversationDisabledBanner\n message={conversation.disabledMessage ?? null}\n messageLink={messageLink}\n />\n )\n if (!canReply) return <MemberMessagesDisabledBanner />\n return (\n <MessageForm.Root\n replyRootAuthorFirstName={replyRootAuthorFirstName}\n conversation={conversation}\n replyRootId={replyRootId}\n currentlyEditingMessage={currentlyEditingMessage}\n onFlaggedInMessageForm={onFlaggedInMessageForm}\n onBeforeSubmit={onBeforeSubmit}\n key={\n currentlyEditingMessage\n ? `edit-message-form-${currentlyEditingMessage.id}`\n : 'new-message-form'\n }\n >\n <MessageForm.AttachmentPicker />\n <MessageForm.Commands />\n <MessageForm.TextInput />\n <MessageForm.SubmitButton />\n </MessageForm.Root>\n )\n}\n\nconst isBeforeLatestMessage = (anchor?: string | null, latestMessageCreatedAt?: string) =>\n !!anchor &&\n !!latestMessageCreatedAt &&\n decodeUlidTime(anchor) < Date.parse(latestMessageCreatedAt)\n\ninterface ConversationScreenTitleProps extends HeaderTitleProps {\n conversation_id: number\n badge?: ConversationBadgeResource\n deleted?: boolean\n muted?: boolean\n}\n\nexport const ConversationScreenTitle = ({\n conversation_id,\n badge,\n children,\n style,\n deleted,\n muted,\n}: ConversationScreenTitleProps) => {\n const styles = usePressableHeaderStyle()\n const navigation = useNavigation()\n const resourceType = badge?.pcoResourceType || ''\n const productName = badge?.appName\n const name = badge?.text || undefined\n\n return (\n <PlatformPressable\n testID=\"conversation-details-button\"\n accessibilityHint=\"Opens details about members and settings\"\n style={styles.container}\n onPress={() => {\n if (deleted) return\n\n navigation.navigate('ConversationDetails', { conversation_id })\n }}\n >\n <View style={styles.titleWrapper}>\n <View style={styles.titleTextContainer}>\n <HeaderTitle maxFontSizeMultiplier={1} style={style}>\n {children}\n </HeaderTitle>\n </View>\n {muted && <Icon name=\"general.bellMuted\" size={12} />}\n {!deleted && <Icon name=\"general.downChevron\" size={12} />}\n </View>\n <Badge\n variant=\"metaSubtle\"\n productLogoName={productName}\n label={resourceType}\n metaLabel={name}\n style={styles.badge}\n maxFontSizeMultiplier={1}\n />\n </PlatformPressable>\n )\n}\n\nconst usePressableHeaderStyle = () => {\n const { width } = useWindowDimensions()\n const slotReserve = useHeaderSlotReserve()\n const headerContainerStyle = { maxWidth: width - slotReserve * 2 }\n\n return StyleSheet.create({\n container: {\n alignItems: Platform.select({ android: 'flex-start', default: 'center' }),\n flex: 1,\n ...headerContainerStyle,\n },\n titleWrapper: {\n alignItems: 'center',\n columnGap: 4,\n flexDirection: 'row',\n flexShrink: 1,\n },\n titleTextContainer: {\n flexShrink: 1,\n minWidth: 0,\n },\n badge: {\n alignSelf: Platform.select({ android: 'flex-start', default: 'center' }),\n marginTop: 2,\n },\n })\n}\n\nconst useStyles = () => {\n const navigationTheme = useNavigationTheme()\n const { bottom } = useSafeAreaInsets()\n\n return StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n backgroundColor: navigationTheme.colors.card,\n paddingBottom: bottom,\n },\n emptyState: {\n flex: 1,\n justifyContent: 'center',\n },\n })\n}\n\n/**\n * useEnsureConversationsRouteExists\n */\nconst useEnsureConversationsRouteExists = () => {\n const navigation = useNavigation()\n const { params } = useRoute<RouteProp<ConversationScreenProps['route']>>()\n\n useEffect(() => {\n const navigationState = navigation.getState()\n const routes = navigationState?.routes || []\n const conversationsRoute = routes.find(r => r.name === 'Conversations')\n\n if (conversationsRoute) return\n\n navigation.dispatch(state => {\n return CommonActions.reset({\n ...state,\n routes: [\n { name: 'Conversations', params: { chat_group_graph_id: params?.chat_group_graph_id } },\n ...routes,\n ],\n index: state.index + 1,\n })\n })\n }, [navigation, params?.chat_group_graph_id])\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ import { QueryClient } from '@tanstack/react-query';
2
+ export declare const invalidateRefetchableQueries: (queryClient: QueryClient) => Promise<void>;
3
+ //# sourceMappingURL=invalidate_refetchable_queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate_refetchable_queries.d.ts","sourceRoot":"","sources":["../../../src/utils/cache/invalidate_refetchable_queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAO1D,eAAO,MAAM,4BAA4B,GAAI,aAAa,WAAW,kBACoB,CAAA"}
@@ -0,0 +1,8 @@
1
+ const isAnchoredMessagesWindow = query => {
2
+ const [, params] = query.queryKey;
3
+ return !!params?.where?.id_around;
4
+ };
5
+ export const invalidateRefetchableQueries = queryClient => queryClient.invalidateQueries({
6
+ predicate: query => !isAnchoredMessagesWindow(query)
7
+ });
8
+ //# sourceMappingURL=invalidate_refetchable_queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidate_refetchable_queries.js","names":["isAnchoredMessagesWindow","query","params","queryKey","where","id_around","invalidateRefetchableQueries","queryClient","invalidateQueries","predicate"],"sources":["../../../src/utils/cache/invalidate_refetchable_queries.ts"],"sourcesContent":["import { Query, QueryClient } from '@tanstack/react-query'\n\nconst isAnchoredMessagesWindow = (query: Query) => {\n const [, params] = query.queryKey as [unknown, { where?: { id_around?: string } } | undefined]\n return !!params?.where?.id_around\n}\n\nexport const invalidateRefetchableQueries = (queryClient: QueryClient) =>\n queryClient.invalidateQueries({ predicate: query => !isAnchoredMessagesWindow(query) })\n"],"mappings":"AAEA,MAAMA,wBAAwB,GAAIC,KAAY,IAAK;EACjD,MAAM,GAAGC,MAAM,CAAC,GAAGD,KAAK,CAACE,QAAqE;EAC9F,OAAO,CAAC,CAACD,MAAM,EAAEE,KAAK,EAAEC,SAAS;AACnC,CAAC;AAED,OAAO,MAAMC,4BAA4B,GAAIC,WAAwB,IACnEA,WAAW,CAACC,iBAAiB,CAAC;EAAEC,SAAS,EAAER,KAAK,IAAI,CAACD,wBAAwB,CAACC,KAAK;AAAE,CAAC,CAAC","ignoreList":[]}
@@ -6,6 +6,7 @@ export declare function updateCacheWithIndividualMessage(queryClient: QueryClien
6
6
  export declare function updateCacheReplyRoots(queryClient: QueryClient, queryKey: unknown[], root: MessageResource): void;
7
7
  export declare function updateCacheWithReaction(queryClient: QueryClient, queryKey: unknown[], event: JoltReactionEvent, currentPersonId: number): void;
8
8
  export declare function isTemporaryMessageId(messageId?: string | null): boolean;
9
+ export declare function newestPersistedMessageId(messages: MessageResource[]): string | undefined;
9
10
  export declare function isNewMessage(message?: MessageResource): boolean;
10
11
  export declare function getThreadedMessagesQueryKey(conversationId: number, replyRootId: string): import("../..").RequestQueryKey;
11
12
  export declare function mergeMessageUpdate(record: MessageResource, current?: MessageResource): MessageResource;
@@ -1 +1 @@
1
- {"version":3,"file":"messages_cache.d.ts","sourceRoot":"","sources":["../../../src/utils/cache/messages_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEjE,OAAO,EAA8B,eAAe,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAU3D,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,QA8B7C;AAID,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,QAgBzB;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,eAAe,QAWtB;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,iBAAiB,EACxB,eAAe,EAAE,MAAM,QAuCxB;AAGD,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEvE;AACD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAE/D;AAED,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mCAMtF;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAWjB"}
1
+ {"version":3,"file":"messages_cache.d.ts","sourceRoot":"","sources":["../../../src/utils/cache/messages_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEjE,OAAO,EAA8B,eAAe,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAU3D,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,QA8B7C;AAID,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,QAgBzB;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,eAAe,QAWtB;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,iBAAiB,EACxB,eAAe,EAAE,MAAM,QAuCxB;AAGD,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEvE;AACD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,GAAG,SAAS,CAExF;AACD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAE/D;AAED,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mCAMtF;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE,eAAe,GACxB,eAAe,CAWjB"}
@@ -96,6 +96,9 @@ export function updateCacheWithReaction(queryClient, queryKey, event, currentPer
96
96
  export function isTemporaryMessageId(messageId) {
97
97
  return !!messageId && messageId.endsWith('-temp');
98
98
  }
99
+ export function newestPersistedMessageId(messages) {
100
+ return messages.find(message => !isTemporaryMessageId(message.id))?.id;
101
+ }
99
102
  export function isNewMessage(message) {
100
103
  return !message?.id || isTemporaryMessageId(message.id);
101
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messages_cache.js","names":["getRequestQueryKey","transformReactionEventDataToReactionCountResource","getMessagesRequestArgs","updateAllRecordsInPagesData","updateOrCreateRecordInPagesData","updateRecordInPagesData","deleteRecordInPagesData","updateCacheWithMessage","queryClient","queryKey","message","event","setQueryData","prev","dataAfterTempRemoval","mine","idempotentKey","data","record","matchFn","existingMessage","isTemporaryMessageId","id","processRecord","current","mergeMessageUpdate","updateCacheWithIndividualMessage","links","meta","updateCacheReplyRoots","root","replyRoot","updateCacheWithReaction","currentPersonId","message_sort_key","oldMessage","reactionCounts","foundMatch","newReactionCounts","map","reactionCount","value","oldData","newReactionCount","count","messageId","endsWith","isNewMessage","getThreadedMessagesQueryKey","conversationId","replyRootId","requestArgs","conversation_id","reply_root_id"],"sources":["../../../src/utils/cache/messages_cache.ts"],"sourcesContent":["import { InfiniteData, QueryClient } from '@tanstack/react-query'\nimport { getRequestQueryKey } from '../../hooks/use_suspense_api'\nimport { ApiCollection, ApiResource, MessageResource } from '../../types'\nimport { JoltReactionEvent } from '../../types/jolt_events'\nimport { transformReactionEventDataToReactionCountResource } from '../jolt/transform_reaction_event_data_to_reaction_count_resource'\nimport { getMessagesRequestArgs } from '../request/get_messages'\nimport {\n updateAllRecordsInPagesData,\n updateOrCreateRecordInPagesData,\n updateRecordInPagesData,\n} from './page_mutations'\nimport { deleteRecordInPagesData } from './page_mutations'\n\nexport function updateCacheWithMessage(\n queryClient: QueryClient,\n queryKey: unknown[],\n message: MessageResource,\n event: 'message.created' | 'message.updated'\n) {\n queryClient.setQueryData<MessagesQueryData>(queryKey, prev => {\n if (event === 'message.created') {\n // Before adding the new message, remove its pending temporary counterpart.\n // The Jolt echo can arrive before the HTTP response has swapped it out.\n let dataAfterTempRemoval = prev\n if (prev && message.mine && message.idempotentKey) {\n dataAfterTempRemoval = deleteRecordInPagesData({\n data: prev,\n record: message,\n matchFn: existingMessage =>\n isTemporaryMessageId(existingMessage.id) &&\n existingMessage.idempotentKey === message.idempotentKey,\n })\n }\n\n return updateOrCreateRecordInPagesData({\n data: dataAfterTempRemoval,\n record: message,\n processRecord: (record, current) => mergeMessageUpdate(record, current),\n })\n } else {\n return updateRecordInPagesData({\n data: prev,\n record: message,\n processRecord: (record, current) => mergeMessageUpdate(record, current),\n })\n }\n })\n}\n\ntype IndividualMessageQueryData = ApiResource<MessageResource>\n\nexport function updateCacheWithIndividualMessage(\n queryClient: QueryClient,\n queryKey: unknown[],\n message: MessageResource\n) {\n queryClient.setQueryData<IndividualMessageQueryData>(queryKey, prev => {\n if (!prev) {\n return {\n data: message,\n links: {},\n meta: {},\n }\n }\n\n return {\n ...prev,\n data: mergeMessageUpdate(message, prev.data),\n }\n })\n}\n\nexport function updateCacheReplyRoots(\n queryClient: QueryClient,\n queryKey: unknown[],\n root: MessageResource\n) {\n queryClient.setQueryData<MessagesQueryData>(queryKey, prev =>\n updateAllRecordsInPagesData({\n data: prev,\n processRecord: message =>\n message.replyRoot?.id === root.id\n ? { ...message, replyRoot: mergeMessageUpdate(root, message.replyRoot) }\n : message,\n })\n )\n}\n\nexport function updateCacheWithReaction(\n queryClient: QueryClient,\n queryKey: unknown[],\n event: JoltReactionEvent,\n currentPersonId: number\n) {\n const message = { id: event.data.data.message_sort_key } as MessageResource\n queryClient.setQueryData<MessagesQueryData>(queryKey, prev =>\n updateRecordInPagesData({\n data: prev,\n record: message,\n processRecord: (record, oldMessage) => {\n const reactionCounts = oldMessage.reactionCounts || []\n let foundMatch = false\n let newReactionCounts = reactionCounts.map(reactionCount => {\n if (reactionCount.value === event.data.data.value) {\n foundMatch = true\n return transformReactionEventDataToReactionCountResource({\n data: event.data.data,\n oldData: reactionCount,\n event: event.event,\n currentPersonId,\n })\n }\n return reactionCount\n })\n\n if (!foundMatch) {\n const newReactionCount = transformReactionEventDataToReactionCountResource({\n data: event.data.data,\n event: event.event,\n currentPersonId,\n })\n\n if (newReactionCount?.count) {\n newReactionCounts = [...newReactionCounts, newReactionCount]\n }\n }\n\n return { ...oldMessage, reactionCounts: newReactionCounts }\n },\n })\n )\n}\n\ntype MessagesQueryData = InfiniteData<ApiCollection<MessageResource>>\nexport function isTemporaryMessageId(messageId?: string | null): boolean {\n return !!messageId && messageId.endsWith('-temp')\n}\nexport function isNewMessage(message?: MessageResource): boolean {\n return !message?.id || isTemporaryMessageId(message.id)\n}\n\nexport function getThreadedMessagesQueryKey(conversationId: number, replyRootId: string) {\n const requestArgs = getMessagesRequestArgs({\n conversation_id: conversationId,\n reply_root_id: replyRootId,\n })\n return getRequestQueryKey(requestArgs)\n}\n\nexport function mergeMessageUpdate(\n record: MessageResource,\n current?: MessageResource\n): MessageResource {\n if (!current) {\n return record\n }\n\n return {\n ...current,\n ...record,\n // Preserve reactions from cache - they're managed via separate reaction events\n reactionCounts: current.reactionCounts || [],\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"messages_cache.js","names":["getRequestQueryKey","transformReactionEventDataToReactionCountResource","getMessagesRequestArgs","updateAllRecordsInPagesData","updateOrCreateRecordInPagesData","updateRecordInPagesData","deleteRecordInPagesData","updateCacheWithMessage","queryClient","queryKey","message","event","setQueryData","prev","dataAfterTempRemoval","mine","idempotentKey","data","record","matchFn","existingMessage","isTemporaryMessageId","id","processRecord","current","mergeMessageUpdate","updateCacheWithIndividualMessage","links","meta","updateCacheReplyRoots","root","replyRoot","updateCacheWithReaction","currentPersonId","message_sort_key","oldMessage","reactionCounts","foundMatch","newReactionCounts","map","reactionCount","value","oldData","newReactionCount","count","messageId","endsWith","newestPersistedMessageId","messages","find","isNewMessage","getThreadedMessagesQueryKey","conversationId","replyRootId","requestArgs","conversation_id","reply_root_id"],"sources":["../../../src/utils/cache/messages_cache.ts"],"sourcesContent":["import { InfiniteData, QueryClient } from '@tanstack/react-query'\nimport { getRequestQueryKey } from '../../hooks/use_suspense_api'\nimport { ApiCollection, ApiResource, MessageResource } from '../../types'\nimport { JoltReactionEvent } from '../../types/jolt_events'\nimport { transformReactionEventDataToReactionCountResource } from '../jolt/transform_reaction_event_data_to_reaction_count_resource'\nimport { getMessagesRequestArgs } from '../request/get_messages'\nimport {\n updateAllRecordsInPagesData,\n updateOrCreateRecordInPagesData,\n updateRecordInPagesData,\n} from './page_mutations'\nimport { deleteRecordInPagesData } from './page_mutations'\n\nexport function updateCacheWithMessage(\n queryClient: QueryClient,\n queryKey: unknown[],\n message: MessageResource,\n event: 'message.created' | 'message.updated'\n) {\n queryClient.setQueryData<MessagesQueryData>(queryKey, prev => {\n if (event === 'message.created') {\n // Before adding the new message, remove its pending temporary counterpart.\n // The Jolt echo can arrive before the HTTP response has swapped it out.\n let dataAfterTempRemoval = prev\n if (prev && message.mine && message.idempotentKey) {\n dataAfterTempRemoval = deleteRecordInPagesData({\n data: prev,\n record: message,\n matchFn: existingMessage =>\n isTemporaryMessageId(existingMessage.id) &&\n existingMessage.idempotentKey === message.idempotentKey,\n })\n }\n\n return updateOrCreateRecordInPagesData({\n data: dataAfterTempRemoval,\n record: message,\n processRecord: (record, current) => mergeMessageUpdate(record, current),\n })\n } else {\n return updateRecordInPagesData({\n data: prev,\n record: message,\n processRecord: (record, current) => mergeMessageUpdate(record, current),\n })\n }\n })\n}\n\ntype IndividualMessageQueryData = ApiResource<MessageResource>\n\nexport function updateCacheWithIndividualMessage(\n queryClient: QueryClient,\n queryKey: unknown[],\n message: MessageResource\n) {\n queryClient.setQueryData<IndividualMessageQueryData>(queryKey, prev => {\n if (!prev) {\n return {\n data: message,\n links: {},\n meta: {},\n }\n }\n\n return {\n ...prev,\n data: mergeMessageUpdate(message, prev.data),\n }\n })\n}\n\nexport function updateCacheReplyRoots(\n queryClient: QueryClient,\n queryKey: unknown[],\n root: MessageResource\n) {\n queryClient.setQueryData<MessagesQueryData>(queryKey, prev =>\n updateAllRecordsInPagesData({\n data: prev,\n processRecord: message =>\n message.replyRoot?.id === root.id\n ? { ...message, replyRoot: mergeMessageUpdate(root, message.replyRoot) }\n : message,\n })\n )\n}\n\nexport function updateCacheWithReaction(\n queryClient: QueryClient,\n queryKey: unknown[],\n event: JoltReactionEvent,\n currentPersonId: number\n) {\n const message = { id: event.data.data.message_sort_key } as MessageResource\n queryClient.setQueryData<MessagesQueryData>(queryKey, prev =>\n updateRecordInPagesData({\n data: prev,\n record: message,\n processRecord: (record, oldMessage) => {\n const reactionCounts = oldMessage.reactionCounts || []\n let foundMatch = false\n let newReactionCounts = reactionCounts.map(reactionCount => {\n if (reactionCount.value === event.data.data.value) {\n foundMatch = true\n return transformReactionEventDataToReactionCountResource({\n data: event.data.data,\n oldData: reactionCount,\n event: event.event,\n currentPersonId,\n })\n }\n return reactionCount\n })\n\n if (!foundMatch) {\n const newReactionCount = transformReactionEventDataToReactionCountResource({\n data: event.data.data,\n event: event.event,\n currentPersonId,\n })\n\n if (newReactionCount?.count) {\n newReactionCounts = [...newReactionCounts, newReactionCount]\n }\n }\n\n return { ...oldMessage, reactionCounts: newReactionCounts }\n },\n })\n )\n}\n\ntype MessagesQueryData = InfiniteData<ApiCollection<MessageResource>>\nexport function isTemporaryMessageId(messageId?: string | null): boolean {\n return !!messageId && messageId.endsWith('-temp')\n}\nexport function newestPersistedMessageId(messages: MessageResource[]): string | undefined {\n return messages.find(message => !isTemporaryMessageId(message.id))?.id\n}\nexport function isNewMessage(message?: MessageResource): boolean {\n return !message?.id || isTemporaryMessageId(message.id)\n}\n\nexport function getThreadedMessagesQueryKey(conversationId: number, replyRootId: string) {\n const requestArgs = getMessagesRequestArgs({\n conversation_id: conversationId,\n reply_root_id: replyRootId,\n })\n return getRequestQueryKey(requestArgs)\n}\n\nexport function mergeMessageUpdate(\n record: MessageResource,\n current?: MessageResource\n): MessageResource {\n if (!current) {\n return record\n }\n\n return {\n ...current,\n ...record,\n // Preserve reactions from cache - they're managed via separate reaction events\n reactionCounts: current.reactionCounts || [],\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planningcenter/chat-react-native",
3
- "version": "4.2.1-qa-staging.3",
3
+ "version": "4.2.1-qa-staging.5",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "@fortawesome/fontawesome-svg-core": "^7.2.0",
35
35
  "@fortawesome/react-native-fontawesome": "^0.3.2",
36
- "@planningcenter/emoji-keyboard": "4.2.1-qa-staging.3",
36
+ "@planningcenter/emoji-keyboard": "4.2.1-qa-staging.5",
37
37
  "lodash-inflection": "^1.5.0"
38
38
  },
39
39
  "peerDependencies": {
@@ -84,5 +84,5 @@
84
84
  "sf-symbols-typescript": "^2.2.0",
85
85
  "typescript": "~6.0.3"
86
86
  },
87
- "gitHead": "5a997b1865ce5d2f022cbd294812ef27726ad8b2"
87
+ "gitHead": "bd4aec108e0d47db3983b45c529f88787afc5beb"
88
88
  }
@@ -13,6 +13,7 @@ import { appGrantsRequestArgs } from '../hooks/use_chat_permissions'
13
13
  import { featuresQueryOptions } from '../hooks/use_features'
14
14
  import { getRequestQueryKey, RequestQueryKey } from '../hooks/use_suspense_api'
15
15
  import { emitAuthRefresh } from '../utils/auth_events'
16
+ import { invalidateRefetchableQueries } from '../utils/cache/invalidate_refetchable_queries'
16
17
  import { ResponseError } from '../utils/response_error'
17
18
  import { ChatContext, ChatContextValue } from './chat_context'
18
19
 
@@ -59,7 +60,7 @@ export function ApiProvider({ children }: ViewProps) {
59
60
  emitAuthRefresh()
60
61
 
61
62
  if (chatQueryClient.isFetching()) {
62
- chatQueryClient.invalidateQueries()
63
+ invalidateRefetchableQueries(chatQueryClient)
63
64
  return
64
65
  }
65
66
 
@@ -65,4 +65,31 @@ describe('useFetchNewerMessages', () => {
65
65
  await expect(act(() => result.current('01C'))).rejects.toThrow('offline')
66
66
  expect(cachedIds()).toEqual(['01C', '01B', '01A'])
67
67
  })
68
+
69
+ it('hands off instead of refetching when more is left than it will walk', async () => {
70
+ for (let i = 0; i < 5; i++) get.mockResolvedValueOnce(page([`01D${i}`], { idGt: `01D${i}` }))
71
+ const onTooFarBehind = jest.fn()
72
+ const invalidate = jest.spyOn(queryClient, 'invalidateQueries')
73
+ const { result } = renderHook(
74
+ () => useFetchNewerMessages({ conversation_id: 1, queryKey, onTooFarBehind }),
75
+ { wrapper }
76
+ )
77
+
78
+ await act(() => result.current('01C'))
79
+
80
+ expect(onTooFarBehind).toHaveBeenCalledTimes(1)
81
+ expect(invalidate).not.toHaveBeenCalled()
82
+ })
83
+
84
+ it('refetches the live cache when more is left and nobody takes over', async () => {
85
+ for (let i = 0; i < 5; i++) get.mockResolvedValueOnce(page([`01D${i}`], { idGt: `01D${i}` }))
86
+ const invalidate = jest.spyOn(queryClient, 'invalidateQueries')
87
+ const { result } = renderHook(() => useFetchNewerMessages({ conversation_id: 1, queryKey }), {
88
+ wrapper,
89
+ })
90
+
91
+ await act(() => result.current('01C'))
92
+
93
+ expect(invalidate).toHaveBeenCalledWith({ queryKey })
94
+ })
68
95
  })
@@ -11,9 +11,15 @@ type Options = {
11
11
  conversation_id: number
12
12
  reply_root_id?: string | null
13
13
  queryKey: unknown[]
14
+ onTooFarBehind?: () => void
14
15
  }
15
16
 
16
- export const useFetchNewerMessages = ({ conversation_id, reply_root_id, queryKey }: Options) => {
17
+ export const useFetchNewerMessages = ({
18
+ conversation_id,
19
+ reply_root_id,
20
+ queryKey,
21
+ onTooFarBehind,
22
+ }: Options) => {
17
23
  const queryClient = useQueryClient()
18
24
  const apiClient = useApiClient()
19
25
 
@@ -37,8 +43,10 @@ export const useFetchNewerMessages = ({ conversation_id, reply_root_id, queryKey
37
43
  prev => prependNewerPage(prev, pages)
38
44
  )
39
45
  const moreThanWeFetched = !!cursor
40
- if (moreThanWeFetched) await queryClient.invalidateQueries({ queryKey })
46
+ if (!moreThanWeFetched) return
47
+ if (onTooFarBehind) onTooFarBehind()
48
+ else await queryClient.invalidateQueries({ queryKey })
41
49
  },
42
- [apiClient, conversation_id, queryClient, queryKey, reply_root_id]
50
+ [apiClient, conversation_id, onTooFarBehind, queryClient, queryKey, reply_root_id]
43
51
  )
44
52
  }
@@ -45,6 +45,7 @@ import { useVideoModerationJoltEvents } from '../hooks/use_video_moderation_jolt
45
45
  import { ConversationResource } from '../types/resources/conversation'
46
46
  import { ConversationBadgeResource } from '../types/resources/conversation_badge'
47
47
  import { MessageResource } from '../types/resources/message'
48
+ import { newestPersistedMessageId } from '../utils/cache/messages_cache'
48
49
  import { gatedMessageCache } from '../utils/gated_message_cache'
49
50
  import { getMessagesQueryKey } from '../utils/request/get_messages'
50
51
  import { decodeUlidTime } from '../utils/ulid'
@@ -137,8 +138,13 @@ function ConversationScreenContent({
137
138
  const caughtUp = !hasPreviousPage
138
139
  const [showJumpToBottomButton, setShowJumpToBottomButton] = useState(false)
139
140
  const readingHistory = showJumpToBottomButton
140
- const newestMessageId = messages[0]?.id
141
- const fetchNewer = useFetchNewerMessages({ conversation_id, reply_root_id, queryKey })
141
+ const newestMessageId = newestPersistedMessageId(messages)
142
+ const fetchNewer = useFetchNewerMessages({
143
+ conversation_id,
144
+ reply_root_id,
145
+ queryKey,
146
+ onTooFarBehind: anchored ? onExitAnchoredMode : undefined,
147
+ })
142
148
  const { onSkippedNewMessage } = useHeldBackMessages({
143
149
  fetchNewer,
144
150
  newestMessageId,
@@ -0,0 +1,23 @@
1
+ import { QueryClient } from '@tanstack/react-query'
2
+ import { getMessagesQueryKey } from '../../request/get_messages'
3
+ import { invalidateRefetchableQueries } from '../invalidate_refetchable_queries'
4
+
5
+ describe('invalidateRefetchableQueries', () => {
6
+ const queryClient = new QueryClient()
7
+ const live = getMessagesQueryKey({ conversation_id: 1 })
8
+ const anchored = getMessagesQueryKey({ conversation_id: 1, anchor: '01A' })
9
+ const other = ['/me/conversations']
10
+
11
+ beforeEach(() => {
12
+ queryClient.clear()
13
+ for (const key of [live, anchored, other]) queryClient.setQueryData(key, { pages: [], pageParams: [] })
14
+ })
15
+
16
+ it('invalidates everything except anchored message windows', async () => {
17
+ await invalidateRefetchableQueries(queryClient)
18
+
19
+ expect(queryClient.getQueryState(live)?.isInvalidated).toBe(true)
20
+ expect(queryClient.getQueryState(other)?.isInvalidated).toBe(true)
21
+ expect(queryClient.getQueryState(anchored)?.isInvalidated).toBe(false)
22
+ })
23
+ })
@@ -1,7 +1,7 @@
1
1
  import { InfiniteData, QueryClient } from '@tanstack/react-query'
2
2
  import type { ApiCollection, MessageResource } from '../../../types'
3
3
  import type { PersonResource } from '../../../types/resources/person'
4
- import { updateCacheWithMessage } from '../messages_cache'
4
+ import { newestPersistedMessageId, updateCacheWithMessage } from '../messages_cache'
5
5
 
6
6
  type MessagesQueryData = InfiniteData<ApiCollection<MessageResource>>
7
7
 
@@ -87,3 +87,16 @@ describe('updateCacheWithMessage on message.created', () => {
87
87
  expect(idsInCache(queryClient)).toEqual(['01F', '01B-temp', '01A-temp'])
88
88
  })
89
89
  })
90
+
91
+ describe('newestPersistedMessageId', () => {
92
+ it('skips optimistic rows so a failed send cannot become the catch-up cursor', () => {
93
+ const messages = [message({ id: '01ZZZ-temp' }), message({ id: '01B' }), message({ id: '01A' })]
94
+
95
+ expect(newestPersistedMessageId(messages)).toBe('01B')
96
+ })
97
+
98
+ it('is undefined when nothing has been persisted', () => {
99
+ expect(newestPersistedMessageId([message({ id: '01ZZZ-temp' })])).toBeUndefined()
100
+ expect(newestPersistedMessageId([])).toBeUndefined()
101
+ })
102
+ })
@@ -0,0 +1,9 @@
1
+ import { Query, QueryClient } from '@tanstack/react-query'
2
+
3
+ const isAnchoredMessagesWindow = (query: Query) => {
4
+ const [, params] = query.queryKey as [unknown, { where?: { id_around?: string } } | undefined]
5
+ return !!params?.where?.id_around
6
+ }
7
+
8
+ export const invalidateRefetchableQueries = (queryClient: QueryClient) =>
9
+ queryClient.invalidateQueries({ predicate: query => !isAnchoredMessagesWindow(query) })
@@ -135,6 +135,9 @@ type MessagesQueryData = InfiniteData<ApiCollection<MessageResource>>
135
135
  export function isTemporaryMessageId(messageId?: string | null): boolean {
136
136
  return !!messageId && messageId.endsWith('-temp')
137
137
  }
138
+ export function newestPersistedMessageId(messages: MessageResource[]): string | undefined {
139
+ return messages.find(message => !isTemporaryMessageId(message.id))?.id
140
+ }
138
141
  export function isNewMessage(message?: MessageResource): boolean {
139
142
  return !message?.id || isTemporaryMessageId(message.id)
140
143
  }