@planningcenter/chat-react-native 4.2.0-rc.0 → 4.2.0-rc.1
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/build/components/conversation/message.d.ts +3 -2
- package/build/components/conversation/message.d.ts.map +1 -1
- package/build/components/conversation/message.js +23 -22
- package/build/components/conversation/message.js.map +1 -1
- package/build/components/conversation/message_list.d.ts +21 -0
- package/build/components/conversation/message_list.d.ts.map +1 -0
- package/build/components/conversation/message_list.js +273 -0
- package/build/components/conversation/message_list.js.map +1 -0
- package/build/components/conversation/message_read_receipts.d.ts +2 -4
- package/build/components/conversation/message_read_receipts.d.ts.map +1 -1
- package/build/components/conversation/message_read_receipts.js +2 -3
- package/build/components/conversation/message_read_receipts.js.map +1 -1
- package/build/components/conversation/reply_shadow_message.d.ts +2 -1
- package/build/components/conversation/reply_shadow_message.d.ts.map +1 -1
- package/build/components/conversation/reply_shadow_message.js +47 -46
- package/build/components/conversation/reply_shadow_message.js.map +1 -1
- package/build/hooks/use_conversation_messages.d.ts.map +1 -1
- package/build/hooks/use_conversation_messages.js +40 -28
- package/build/hooks/use_conversation_messages.js.map +1 -1
- package/build/hooks/use_conversation_messages_jolt_events.d.ts.map +1 -1
- package/build/hooks/use_conversation_messages_jolt_events.js +6 -1
- package/build/hooks/use_conversation_messages_jolt_events.js.map +1 -1
- package/build/screens/conversation_screen.d.ts.map +1 -1
- package/build/screens/conversation_screen.js +184 -365
- package/build/screens/conversation_screen.js.map +1 -1
- package/build/types/resources/message.d.ts +1 -0
- package/build/types/resources/message.d.ts.map +1 -1
- package/build/types/resources/message.js.map +1 -1
- package/build/utils/cache/messages_cache.d.ts +1 -0
- package/build/utils/cache/messages_cache.d.ts.map +1 -1
- package/build/utils/cache/messages_cache.js +10 -1
- package/build/utils/cache/messages_cache.js.map +1 -1
- package/build/utils/client/transform_response.d.ts.map +1 -1
- package/build/utils/client/transform_response.js +9 -5
- package/build/utils/client/transform_response.js.map +1 -1
- package/build/utils/group_messages.d.ts +1 -0
- package/build/utils/group_messages.d.ts.map +1 -1
- package/build/utils/group_messages.js +10 -1
- package/build/utils/group_messages.js.map +1 -1
- package/build/utils/replace_equal_by_id.d.ts +6 -0
- package/build/utils/replace_equal_by_id.d.ts.map +1 -0
- package/build/utils/replace_equal_by_id.js +41 -0
- package/build/utils/replace_equal_by_id.js.map +1 -0
- package/build/utils/request/messages_data_options.d.ts.map +1 -1
- package/build/utils/request/messages_data_options.js +1 -1
- package/build/utils/request/messages_data_options.js.map +1 -1
- package/package.json +2 -2
- package/src/components/conversation/__tests__/message_list.test.tsx +277 -0
- package/src/components/conversation/__tests__/reply_shadow_message.test.tsx +119 -0
- package/src/components/conversation/message.tsx +15 -18
- package/src/components/conversation/message_list.tsx +157 -0
- package/src/components/conversation/message_read_receipts.tsx +3 -5
- package/src/components/conversation/reply_shadow_message.tsx +9 -7
- package/src/hooks/use_conversation_messages.ts +5 -1
- package/src/hooks/use_conversation_messages_jolt_events.ts +7 -0
- package/src/screens/conversation_screen.tsx +11 -104
- package/src/types/resources/message.ts +1 -0
- package/src/utils/__tests__/group_messages.test.ts +48 -0
- package/src/utils/__tests__/replace_equal_by_id.test.ts +73 -0
- package/src/utils/cache/__tests__/messages_cache_reply_roots.test.ts +70 -0
- package/src/utils/cache/messages_cache.ts +21 -1
- package/src/utils/client/__tests__/transform_response.test.ts +62 -0
- package/src/utils/client/transform_response.ts +7 -5
- package/src/utils/group_messages.ts +18 -1
- package/src/utils/replace_equal_by_id.ts +42 -0
- package/src/utils/request/messages_data_options.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation_screen.js","names":["date","formatDate","HeaderTitle","PlatformPressable","CommonActions","useNavigation","useTheme","useNavigationTheme","useRoute","React","useCallback","useEffect","useRef","useState","FlatList","Platform","StyleSheet","useWindowDimensions","View","useSafeAreaInsets","Badge","Icon","Text","ConversationStartBanner","JumpToBottomButton","Message","MessageForm","ConversationDisabledBanner","LeaderMessagesDisabledBanner","MemberMessagesDisabledBanner","ReplyShadowMessage","SystemMessage","TypingIndicator","KeyboardView","useHeaderSlotReserve","BlankState","ConversationContextProvider","useMessageAvailableMembersAction","useConversation","useConversationJoltEvents","useConversationMessages","useConversationMessagesJoltEvents","useMarkLatestMessageRead","analyticsEvents","normalizeAnalyticsMetadata","usePublishProductAnalyticsEvent","useRestAwayFromDismissEdge","useVideoModerationJoltEvents","getRelativeDateStatus","groupMessages","CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL","isSystemMessage","jsx","_jsx","jsxs","_jsxs","ConversationScreen","t0","$","_c","route","conversation_id","reply_root_id","params","t1","data","conversation","t2","t3","conversation_show_opened","t4","t5","ConversationScreenContent","t6","currentPageReplyRootId","children","styles","useStyles","navigation","editing_message_id","reply_root_author_name","messages","fetchNextPage","hasNextPage","conversationId","markHandledByMessageForm","useEnsureConversationsRouteExists","ms","inReplyScreen","messagesWithSeparators","noMessages","length","repliesDisabled","memberAbility","badges","title","canReply","showLeaderDisabledReplyBanner","canDeleteNonAuthoredMessages","t7","t8","m","String","id","find","currentlyEditingMessage","split","replyRootAuthorFirstName","replyHeaderTitle","muted","conversationMembership","listRef","showJumpToBottomButton","setShowJumpToBottomButton","t9","Symbol","for","event","offsetY","nativeEvent","contentOffset","y","trackScroll","t10","enabled","OS","restOffset","onLayout","onContentSizeChange","onMomentumScrollEnd","onScrollEndDrag","t11","current","scrollToOffset","offset","handleReturnToBottom","t12","deleted","setParams","badge","t13","t14","t15","Imagery","name","t16","Content","Heading","t17","goBack","Root","Button","onPress","accessibilityHint","accessibilityRole","t18","container","style","emptyState","listContainer","listHeader","hasMessages","inverted","contentContainerStyle","keyExtractor","_temp","scrollEventThrottle","ListFooterComponent","renderItem","item","item_0","type","InlineDateSeparator","latestReadMessageSortKey","onEndReached","ListHeaderComponent","t19","ConversationBottomBar","t20","t21","replyRootId","onFlaggedInMessageForm","messageLink","disabled","disabledMessage","message","AttachmentPicker","Commands","TextInput","SubmitButton","useDateSeparatorStyles","isThisYear","showYear","year","dateStamp","separator","dateText","variant","theme","colors","borderColorDefaultBase","create","alignItems","flexDirection","paddingHorizontal","paddingVertical","flex","height","borderTopWidth","borderTopColor","ConversationScreenTitle","usePressableHeaderStyle","resourceType","pcoResourceType","productName","appName","text","undefined","navigate","maxFontSizeMultiplier","titleTextContainer","size","titleWrapper","testID","width","slotReserve","headerContainerStyle","maxWidth","select","android","default","columnGap","flexShrink","minWidth","alignSelf","marginTop","navigationTheme","bottom","card","justifyContent","backgroundColor","paddingBottom","chat_group_graph_id","navigationState","getState","routes","conversationsRoute","_temp2","dispatch","state","reset","index","r"],"sources":["../../src/screens/conversation_screen.tsx"],"sourcesContent":["import { date as formatDate } from '@planningcenter/datetime-fmt'\nimport { 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, { 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, Text } from '../components'\nimport { ConversationStartBanner } from '../components/conversation/conversation_start_banner'\nimport { JumpToBottomButton } from '../components/conversation/jump_to_bottom_button'\nimport { Message } from '../components/conversation/message'\nimport { MessageForm } from '../components/conversation/message_form'\nimport {\n ConversationDisabledBanner,\n LeaderMessagesDisabledBanner,\n MemberMessagesDisabledBanner,\n} from '../components/conversation/messages_disabled_banners'\nimport { ReplyShadowMessage } from '../components/conversation/reply_shadow_message'\nimport { SystemMessage } from '../components/conversation/system_message'\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 { useTheme } from '../hooks'\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 { 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 { getRelativeDateStatus } from '../utils/date'\nimport { groupMessages, type DateSeparator } from '../utils/group_messages'\nimport { CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL } from '../utils/styles'\nimport { isSystemMessage } from '../utils/system_messages'\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 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 } = route.params\n\n const { data: conversation } = useConversation({ conversation_id })\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 >\n <ConversationScreenContent route={route} />\n </ConversationContextProvider>\n )\n}\n\nfunction ConversationScreenContent({ route }: ConversationScreenProps) {\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 { messages, fetchNextPage, hasNextPage } = useConversationMessages({\n conversation_id,\n reply_root_id,\n })\n useConversationJoltEvents({ conversationId: conversation_id })\n useConversationMessagesJoltEvents({ conversationId: conversation_id })\n const { markHandledByMessageForm } = useVideoModerationJoltEvents()\n useEnsureConversationsRouteExists()\n useMarkLatestMessageRead({ conversation, messages })\n const messagesWithSeparators = groupMessages({\n ms: messages,\n inReplyScreen: !!reply_root_id,\n })\n const noMessages = messagesWithSeparators.length === 0\n\n const { repliesDisabled, memberAbility, badges, title } = conversation\n const canReply = memberAbility?.canReply\n const showLeaderDisabledReplyBanner = canReply && repliesDisabled\n const canDeleteNonAuthoredMessages = memberAbility?.canDeleteNonAuthoredMessages ?? false\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 [showJumpToBottomButton, setShowJumpToBottomButton] = useState(false)\n\n const trackScroll = (event: any) => {\n const offsetY = event.nativeEvent.contentOffset.y\n setShowJumpToBottomButton(offsetY > 200)\n }\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 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 <FlatList\n inverted\n ref={listRef}\n contentContainerStyle={styles.listContainer}\n data={messagesWithSeparators}\n keyExtractor={item => item.id}\n onScroll={trackScroll}\n onLayout={onLayout}\n onContentSizeChange={onContentSizeChange}\n onScrollEndDrag={onScrollEndDrag}\n onMomentumScrollEnd={onMomentumScrollEnd}\n scrollEventThrottle={10}\n ListFooterComponent={\n hasNextPage ? null : (\n <ConversationStartBanner conversation={conversation} hasMessages={true} />\n )\n }\n renderItem={({ item }) => {\n if (item.type === 'DateSeparator') {\n return <InlineDateSeparator {...item} />\n }\n\n if (item.type === 'ReplyShadowMessage') {\n return (\n <ReplyShadowMessage\n {...(item as any)}\n conversation_id={conversation_id}\n inReplyScreen={!!reply_root_id}\n />\n )\n }\n\n if (isSystemMessage(item)) {\n return <SystemMessage message={item} conversationId={conversation_id} />\n }\n\n return (\n <Message\n {...item}\n canDeleteNonAuthoredMessages={canDeleteNonAuthoredMessages}\n conversation_id={conversation_id}\n latestReadMessageSortKey={conversation?.latestReadMessageSortKey}\n inReplyScreen={!!reply_root_id}\n />\n )\n }}\n onEndReached={() => fetchNextPage()}\n ListHeaderComponent={<View style={styles.listHeader} />}\n />\n )}\n <JumpToBottomButton onPress={handleReturnToBottom} visible={showJumpToBottomButton} />\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 />\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}\n\nfunction ConversationBottomBar({\n conversation,\n canReply,\n replyRootAuthorFirstName,\n replyRootId,\n currentlyEditingMessage,\n onFlaggedInMessageForm,\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 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\nfunction InlineDateSeparator({ date }: DateSeparator) {\n const styles = useDateSeparatorStyles()\n const { isThisYear } = getRelativeDateStatus(date)\n const showYear = !isThisYear\n const dateStamp = formatDate(date, { style: 'long', year: showYear })\n\n return (\n <View style={styles.container}>\n <View style={styles.separator} />\n <Text variant=\"footnote\" style={styles.dateText}>\n {dateStamp}\n </Text>\n <View style={styles.separator} />\n </View>\n )\n}\n\nconst useDateSeparatorStyles = () => {\n const theme = useTheme()\n return StyleSheet.create({\n container: {\n alignItems: 'center',\n flexDirection: 'row',\n paddingHorizontal: CONVERSATION_MESSAGE_LIST_PADDING_HORIZONTAL,\n paddingVertical: 16,\n },\n separator: {\n flex: 1,\n height: 1,\n borderTopWidth: 1,\n borderTopColor: theme.colors.borderColorDefaultBase,\n },\n dateText: {\n paddingHorizontal: 8,\n },\n })\n}\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 listContainer: {\n paddingVertical: 12,\n },\n listHeader: {\n // Just whitespace to provide space where the typing indicator can be\n height: 16,\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","useCallback","useEffect","useRef","useState","Platform","StyleSheet","useWindowDimensions","View","useSafeAreaInsets","Badge","Icon","ConversationStartBanner","JumpToBottomButton","MessageForm","MessageList","ConversationDisabledBanner","LeaderMessagesDisabledBanner","MemberMessagesDisabledBanner","TypingIndicator","KeyboardView","useHeaderSlotReserve","BlankState","ConversationContextProvider","useMessageAvailableMembersAction","useConversation","useConversationJoltEvents","useConversationMessages","useConversationMessagesJoltEvents","useMarkLatestMessageRead","analyticsEvents","normalizeAnalyticsMetadata","usePublishProductAnalyticsEvent","useRestAwayFromDismissEdge","useVideoModerationJoltEvents","jsx","_jsx","jsxs","_jsxs","ConversationScreen","t0","$","_c","route","conversation_id","reply_root_id","params","t1","data","conversation","t2","t3","conversation_show_opened","t4","t5","ConversationScreenContent","t6","currentPageReplyRootId","children","styles","useStyles","navigation","editing_message_id","reply_root_author_name","messages","fetchNextPage","hasNextPage","conversationId","markHandledByMessageForm","useEnsureConversationsRouteExists","noMessages","length","repliesDisabled","memberAbility","badges","title","canReply","showLeaderDisabledReplyBanner","m","String","id","find","currentlyEditingMessage","split","replyRootAuthorFirstName","replyHeaderTitle","muted","conversationMembership","listRef","showJumpToBottomButton","setShowJumpToBottomButton","t7","Symbol","for","event","offsetY","nativeEvent","contentOffset","y","trackScroll","t8","enabled","OS","restOffset","onLayout","onContentSizeChange","onMomentumScrollEnd","onScrollEndDrag","t9","current","scrollToOffset","offset","handleReturnToBottom","t10","deleted","setParams","badge","t11","t12","t13","Imagery","name","t14","Content","Heading","t15","goBack","Root","Button","onPress","accessibilityHint","accessibilityRole","t16","container","style","emptyState","hasMessages","onEndReached","t17","ConversationBottomBar","t18","t19","replyRootId","onFlaggedInMessageForm","messageLink","disabled","disabledMessage","message","AttachmentPicker","Commands","TextInput","SubmitButton","ConversationScreenTitle","usePressableHeaderStyle","resourceType","pcoResourceType","productName","appName","text","undefined","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, { 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 { 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 { 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'\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 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 } = route.params\n\n const { data: conversation } = useConversation({ conversation_id })\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 >\n <ConversationScreenContent route={route} />\n </ConversationContextProvider>\n )\n}\n\nfunction ConversationScreenContent({ route }: ConversationScreenProps) {\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 { messages, fetchNextPage, hasNextPage } = useConversationMessages({\n conversation_id,\n reply_root_id,\n })\n useConversationJoltEvents({ conversationId: conversation_id })\n useConversationMessagesJoltEvents({ conversationId: conversation_id })\n const { markHandledByMessageForm } = useVideoModerationJoltEvents()\n useEnsureConversationsRouteExists()\n useMarkLatestMessageRead({ conversation, messages })\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 [showJumpToBottomButton, setShowJumpToBottomButton] = useState(false)\n\n const trackScroll = (event: any) => {\n const offsetY = event.nativeEvent.contentOffset.y\n setShowJumpToBottomButton(offsetY > 200)\n }\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 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 hasNextPage={hasNextPage}\n onEndReached={() => fetchNextPage()}\n onScroll={trackScroll}\n onLayout={onLayout}\n onContentSizeChange={onContentSizeChange}\n onScrollEndDrag={onScrollEndDrag}\n onMomentumScrollEnd={onMomentumScrollEnd}\n />\n )}\n <JumpToBottomButton onPress={handleReturnToBottom} visible={showJumpToBottomButton} />\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 />\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}\n\nfunction ConversationBottomBar({\n conversation,\n canReply,\n replyRootAuthorFirstName,\n replyRootId,\n currentlyEditingMessage,\n onFlaggedInMessageForm,\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 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\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":[]}
|
|
@@ -16,6 +16,7 @@ export interface MessageResource {
|
|
|
16
16
|
reactionCounts: ReactionCountResource[];
|
|
17
17
|
replyCount: number;
|
|
18
18
|
replyRootId?: string | null;
|
|
19
|
+
replyRoot?: MessageResource | null;
|
|
19
20
|
idempotentKey?: string | null;
|
|
20
21
|
messageType: string;
|
|
21
22
|
personIdsForSystemEvent?: number[] | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/types/resources/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAA;AACnF,OAAO,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAA;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,8BAA8B,EAAE,CAAA;IAC7C,MAAM,EAAE,cAAc,CAAA;IACtB,cAAc,EAAE,qBAAqB,EAAE,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACzC,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAGnF,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAA;IACnD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAGlC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,uCAAuC,EAAE,CAAA;CACjE"}
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/types/resources/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAA;AACnF,OAAO,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAA;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,8BAA8B,EAAE,CAAA;IAC7C,MAAM,EAAE,cAAc,CAAA;IACtB,cAAc,EAAE,qBAAqB,EAAE,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACzC,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAGnF,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAA;IACnD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAGlC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,uCAAuC,EAAE,CAAA;CACjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","names":[],"sources":["../../../src/types/resources/message.ts"],"sourcesContent":["import { DenormalizedAttachmentResource } from './denormalized_attachment_resource'\nimport { DenormalizedAttachmentResourceForCreate } from './denormalized_attachment_resource_for_create'\nimport type { PersonResource } from './person'\nimport type { ReactionCountResource } from './reaction'\n\nexport interface MessageResource {\n type: 'Message'\n id: string\n text: string | null\n html: string\n createdAt: string\n deletedAt: string | null\n textEditedAt: string | null\n mine: boolean\n attachments: DenormalizedAttachmentResource[]\n author: PersonResource\n reactionCounts: ReactionCountResource[]\n replyCount: number\n replyRootId?: string | null\n idempotentKey?: string | null\n messageType: string\n personIdsForSystemEvent?: number[] | null\n systemTextParts?: { names: string[]; overflowCount: number; action: string } | null\n\n // Custom Local Properties we set for rendering\n renderAuthor?: boolean\n renderTime?: boolean\n myLatestInConversation?: boolean\n lastInGroup?: boolean\n threadPosition?: 'first' | 'center' | 'last' | null\n prevIsMyReply?: boolean\n nextIsMyReply?: boolean\n nextRendersAuthor?: boolean\n isReplyShadowMessage?: boolean\n nextIsReplyShadowMessage?: boolean\n\n // Properties for mutation state\n pending?: boolean // Indicates if the message is optimistically created and pending server response\n error?: string // Error message if the message failed to send\n attachmentsForCreate?: DenormalizedAttachmentResourceForCreate[]\n}\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"message.js","names":[],"sources":["../../../src/types/resources/message.ts"],"sourcesContent":["import { DenormalizedAttachmentResource } from './denormalized_attachment_resource'\nimport { DenormalizedAttachmentResourceForCreate } from './denormalized_attachment_resource_for_create'\nimport type { PersonResource } from './person'\nimport type { ReactionCountResource } from './reaction'\n\nexport interface MessageResource {\n type: 'Message'\n id: string\n text: string | null\n html: string\n createdAt: string\n deletedAt: string | null\n textEditedAt: string | null\n mine: boolean\n attachments: DenormalizedAttachmentResource[]\n author: PersonResource\n reactionCounts: ReactionCountResource[]\n replyCount: number\n replyRootId?: string | null\n replyRoot?: MessageResource | null\n idempotentKey?: string | null\n messageType: string\n personIdsForSystemEvent?: number[] | null\n systemTextParts?: { names: string[]; overflowCount: number; action: string } | null\n\n // Custom Local Properties we set for rendering\n renderAuthor?: boolean\n renderTime?: boolean\n myLatestInConversation?: boolean\n lastInGroup?: boolean\n threadPosition?: 'first' | 'center' | 'last' | null\n prevIsMyReply?: boolean\n nextIsMyReply?: boolean\n nextRendersAuthor?: boolean\n isReplyShadowMessage?: boolean\n nextIsReplyShadowMessage?: boolean\n\n // Properties for mutation state\n pending?: boolean // Indicates if the message is optimistically created and pending server response\n error?: string // Error message if the message failed to send\n attachmentsForCreate?: DenormalizedAttachmentResourceForCreate[]\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -3,6 +3,7 @@ import { MessageResource } from '../../types';
|
|
|
3
3
|
import { JoltReactionEvent } from '../../types/jolt_events';
|
|
4
4
|
export declare function updateCacheWithMessage(queryClient: QueryClient, queryKey: unknown[], message: MessageResource, event: 'message.created' | 'message.updated'): void;
|
|
5
5
|
export declare function updateCacheWithIndividualMessage(queryClient: QueryClient, queryKey: unknown[], message: MessageResource): void;
|
|
6
|
+
export declare function updateCacheReplyRoots(queryClient: QueryClient, queryKey: unknown[], root: MessageResource): void;
|
|
6
7
|
export declare function updateCacheWithReaction(queryClient: QueryClient, queryKey: unknown[], event: JoltReactionEvent, currentPersonId: number): void;
|
|
7
8
|
export declare function isTemporaryMessageId(messageId?: string | null): boolean;
|
|
8
9
|
export declare function isNewMessage(message?: MessageResource): boolean;
|
|
@@ -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;
|
|
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,7 +1,7 @@
|
|
|
1
1
|
import { getRequestQueryKey } from '../../hooks/use_suspense_api';
|
|
2
2
|
import { transformReactionEventDataToReactionCountResource } from '../jolt/transform_reaction_event_data_to_reaction_count_resource';
|
|
3
3
|
import { getMessagesRequestArgs } from '../request/get_messages';
|
|
4
|
-
import { updateOrCreateRecordInPagesData, updateRecordInPagesData } from './page_mutations';
|
|
4
|
+
import { updateAllRecordsInPagesData, updateOrCreateRecordInPagesData, updateRecordInPagesData } from './page_mutations';
|
|
5
5
|
import { deleteRecordInPagesData } from './page_mutations';
|
|
6
6
|
export function updateCacheWithMessage(queryClient, queryKey, message, event) {
|
|
7
7
|
queryClient.setQueryData(queryKey, prev => {
|
|
@@ -45,6 +45,15 @@ export function updateCacheWithIndividualMessage(queryClient, queryKey, message)
|
|
|
45
45
|
};
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
|
+
export function updateCacheReplyRoots(queryClient, queryKey, root) {
|
|
49
|
+
queryClient.setQueryData(queryKey, prev => updateAllRecordsInPagesData({
|
|
50
|
+
data: prev,
|
|
51
|
+
processRecord: message => message.replyRoot?.id === root.id ? {
|
|
52
|
+
...message,
|
|
53
|
+
replyRoot: mergeMessageUpdate(root, message.replyRoot)
|
|
54
|
+
} : message
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
48
57
|
export function updateCacheWithReaction(queryClient, queryKey, event, currentPersonId) {
|
|
49
58
|
const message = {
|
|
50
59
|
id: event.data.data.message_sort_key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages_cache.js","names":["getRequestQueryKey","transformReactionEventDataToReactionCountResource","getMessagesRequestArgs","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","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 {
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform_response.d.ts","sourceRoot":"","sources":["../../../src/utils/client/transform_response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transform_response.d.ts","sourceRoot":"","sources":["../../../src/utils/client/transform_response.ts"],"names":[],"mappings":"AAmGA,QAAA,MAAM,iBAAiB,yBAAyD,CAAA;AAEhF,eAAe,iBAAiB,CAAA"}
|
|
@@ -36,21 +36,25 @@ const transformRelationships = relationships => {
|
|
|
36
36
|
}
|
|
37
37
|
}, {});
|
|
38
38
|
};
|
|
39
|
-
const addIncludedRecords = (
|
|
39
|
+
const addIncludedRecords = (record, included, seen, parent) => {
|
|
40
|
+
const {
|
|
41
|
+
relationships
|
|
42
|
+
} = record;
|
|
40
43
|
return Object.keys(relationships || {}).reduce((acc, key) => {
|
|
41
44
|
const relationship = relationships[key];
|
|
42
45
|
if (_.isArray(relationship.data)) {
|
|
43
46
|
const records = _(relationship.data).map(elem => _.find(included, elem)).compact() // account for orphans
|
|
44
47
|
.value();
|
|
45
|
-
return _.set(acc, _.pluralize(key), _.map(records,
|
|
48
|
+
return _.set(acc, _.pluralize(key), _.map(records, related => transformRecord(related, included, seen)));
|
|
46
49
|
} else {
|
|
47
50
|
const [id, type] = _.at(relationship, ['data.id', 'data.type']);
|
|
48
51
|
if (id && type) {
|
|
49
|
-
const
|
|
52
|
+
const isSelfReference = id === record.id && type === record.type;
|
|
53
|
+
const related = isSelfReference ? undefined : _.find(included, {
|
|
50
54
|
id,
|
|
51
55
|
type
|
|
52
56
|
});
|
|
53
|
-
return _.set(acc, key,
|
|
57
|
+
return _.set(acc, key, related ? transformRecord(related, included, seen) : null);
|
|
54
58
|
} else {
|
|
55
59
|
return acc;
|
|
56
60
|
}
|
|
@@ -77,7 +81,7 @@ const transformRecord = (record, included, seen) => {
|
|
|
77
81
|
..._.mapKeys(attributes, (v, k) => k === 'length' ? `${type.charAt(0).toLowerCase()}${type.slice(1)}Length` : k, {})
|
|
78
82
|
};
|
|
79
83
|
seen.set(record, transformed);
|
|
80
|
-
return addIncludedRecords(
|
|
84
|
+
return addIncludedRecords(record, included, seen, transformed);
|
|
81
85
|
}
|
|
82
86
|
};
|
|
83
87
|
const defaultTransformResponse = response => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform_response.js","names":["_","inflection","keysToCamelCase","mixin","singular","plural","transformId","id","thru","parseInt","int","transformRelationships","relationships","Object","keys","reduce","acc","key","relationship","isArray","data","ids","map","singularize","get","type","addIncludedRecords","included","seen","parent","records","elem","find","compact","value","set","pluralize","
|
|
1
|
+
{"version":3,"file":"transform_response.js","names":["_","inflection","keysToCamelCase","mixin","singular","plural","transformId","id","thru","parseInt","int","transformRelationships","relationships","Object","keys","reduce","acc","key","relationship","isArray","data","ids","map","singularize","get","type","addIncludedRecords","record","included","seen","parent","records","elem","find","compact","value","set","pluralize","related","transformRecord","at","isSelfReference","undefined","attributes","links","has","transformed","mapKeys","v","k","charAt","toLowerCase","slice","defaultTransformResponse","response","isEmpty","meta","WeakMap","result","d","transformResponse","flowRight"],"sources":["../../../src/utils/client/transform_response.ts"],"sourcesContent":["// @ts-nocheck\n// TODO: Fix this file but write tests first\n\nimport _ from 'lodash'\nimport inflection from 'lodash-inflection/lib/lodash-inflection'\nimport { keysToCamelCase } from './utils'\n\n_.mixin({ ...inflection })\n\n// Teach some bad grammar\n_.singular(/^(media)$/i, '$1')\n_.plural(/^(media)$/i, '$1')\n\n// eslint-disable-next-line eqeqeq\nconst transformId = id => _.thru(parseInt(id, 10), int => (int == id ? int : id))\n\nconst transformRelationships = relationships => {\n return Object.keys(relationships || {}).reduce((acc, key) => {\n const relationship = relationships[key]\n if (_.isArray(relationship.data)) {\n const ids = _.map(relationship.data, ({ id }) => transformId(id))\n return { ...acc, [`${_.singularize(key)}_ids`]: ids }\n } else {\n const id = _.get(relationship, 'data.id')\n const type = _.get(relationship, 'data.type', null)\n return {\n ...acc,\n [`${key}_id`]: id ? transformId(id) : null,\n [`${key}_type`]: type,\n }\n }\n }, {})\n}\n\nconst addIncludedRecords = (record, included, seen, parent) => {\n const { relationships } = record\n return Object.keys(relationships || {}).reduce((acc, key) => {\n const relationship = relationships[key]\n if (_.isArray(relationship.data)) {\n const records = _(relationship.data)\n .map(elem => _.find(included, elem))\n .compact() // account for orphans\n .value()\n return _.set(\n acc,\n _.pluralize(key),\n _.map(records, related => transformRecord(related, included, seen))\n )\n } else {\n const [id, type] = _.at(relationship, ['data.id', 'data.type'])\n if (id && type) {\n const isSelfReference = id === record.id && type === record.type\n const related = isSelfReference ? undefined : _.find(included, { id, type })\n return _.set(acc, key, related ? transformRecord(related, included, seen) : null)\n } else {\n return acc\n }\n }\n }, parent)\n}\n\nconst transformRecord = (record, included, seen) => {\n if (!record) return record\n const { id, attributes, links, relationships, type } = record\n\n if (seen.has(record)) {\n return seen.get(record)\n } else {\n const transformed = {\n id: transformId(id),\n type,\n links,\n ...transformRelationships(relationships),\n ..._.mapKeys(\n attributes,\n (v, k) => (k === 'length' ? `${type.charAt(0).toLowerCase()}${type.slice(1)}Length` : k),\n {}\n ),\n }\n\n seen.set(record, transformed)\n\n return addIncludedRecords(record, included, seen, transformed)\n }\n}\n\nconst defaultTransformResponse = response => {\n if (_.isEmpty(response)) return response\n const { data, included, meta, links } = response\n const seen = new WeakMap()\n\n if (_.isArray(data)) {\n const result = data.map(d => transformRecord(d, included, seen))\n return { data: result, meta, links, ...data }\n } else {\n return { data: { ...transformRecord(data, included, seen) }, meta, links }\n }\n}\n\nconst transformResponse = _.flowRight(keysToCamelCase, defaultTransformResponse)\n\nexport default transformResponse\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group_messages.d.ts","sourceRoot":"","sources":["../../src/utils/group_messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAMjE,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,aAAa,GAAG,kBAAkB,CAAA;AAElF,UAAU,kBAAkB;IAC1B,EAAE,EAAE,eAAe,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,kBAAkB,GAAG,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"group_messages.d.ts","sourceRoot":"","sources":["../../src/utils/group_messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAMjE,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;IACjC,oBAAoB,EAAE,OAAO,CAAA;IAC7B,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,aAAa,GAAG,kBAAkB,CAAA;AAElF,UAAU,kBAAkB;IAC1B,EAAE,EAAE,eAAe,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,kBAAkB,GAAG,eAAe,EAAE,CAyC1F"}
|
|
@@ -6,6 +6,7 @@ export function groupMessages({
|
|
|
6
6
|
inReplyScreen
|
|
7
7
|
}) {
|
|
8
8
|
const items = [];
|
|
9
|
+
const messagesById = new Map(ms.map(message => [message.id, message]));
|
|
9
10
|
let myLatestSeen = false;
|
|
10
11
|
let nextNeighborEnriched;
|
|
11
12
|
ms.forEach((message, i) => {
|
|
@@ -22,7 +23,10 @@ export function groupMessages({
|
|
|
22
23
|
}
|
|
23
24
|
const isMyLatest = !myLatestSeen && message.mine;
|
|
24
25
|
if (isMyLatest) myLatestSeen = true;
|
|
25
|
-
const enriched = enrichRegularMessage(
|
|
26
|
+
const enriched = enrichRegularMessage({
|
|
27
|
+
...message,
|
|
28
|
+
replyRoot: resolveReplyRoot(message, messagesById)
|
|
29
|
+
}, prev, next, isMyLatest, !!inReplyScreen);
|
|
26
30
|
items.push(enriched);
|
|
27
31
|
const shadow = replyShadowFor(enriched, prev);
|
|
28
32
|
if (shadow) items.push(shadow);
|
|
@@ -39,6 +43,10 @@ function neighborsOf(arr, i) {
|
|
|
39
43
|
next: arr[i - 1]
|
|
40
44
|
};
|
|
41
45
|
}
|
|
46
|
+
function resolveReplyRoot(message, messagesById) {
|
|
47
|
+
if (!message.replyRootId || message.replyRootId === message.id) return null;
|
|
48
|
+
return messagesById.get(message.replyRootId) ?? message.replyRoot ?? null;
|
|
49
|
+
}
|
|
42
50
|
function enrichSystemMessage(message, next) {
|
|
43
51
|
return {
|
|
44
52
|
...message,
|
|
@@ -114,6 +122,7 @@ function replyShadowFor(message, prev) {
|
|
|
114
122
|
type: 'ReplyShadowMessage',
|
|
115
123
|
id: `${message.id}-${message.replyRootId}`,
|
|
116
124
|
messageId: message.replyRootId,
|
|
125
|
+
replyRoot: message.replyRoot ?? null,
|
|
117
126
|
isReplyShadowMessage: true,
|
|
118
127
|
nextRendersAuthor: message.renderAuthor ?? false
|
|
119
128
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group_messages.js","names":["dayjs","isSystemMessage","FIVE_MINUTES_MS","groupMessages","ms","inReplyScreen","items","myLatestSeen","nextNeighborEnriched","forEach","message","i","prev","neighborsOf","next","enriched","enrichSystemMessage","push","datesDifferBetween","dateSeparator","isMyLatest","mine","enrichRegularMessage","shadow","replyShadowFor","arr","myLatestInConversation","lastInGroup","renderAuthor","nextRendersAuthor","isReplyShadowMessage","nextIsReplyShadowMessage","threadPosition","inThread","replyRootId","showThreadDetails","startsNewGroup","nextIntroducesReplyShadow","threadPositionFor","prevIsMyReply","undefined","nextIsMyReply","a","b","author","id","differsByMoreThan5Min","Math","abs","toMillis","createdAt","iso","Date","getTime","dateKey","format","type","date","isThreadRoot","isLast","current","nextInThread","nextIsThreadRoot","differentThread","enteringNewThread","messageId"],"sources":["../../src/utils/group_messages.ts"],"sourcesContent":["import type { MessageResource } from '../types/resources/message'\nimport dayjs from './dayjs'\nimport { isSystemMessage } from './system_messages'\n\nconst FIVE_MINUTES_MS = 5 * 60 * 1000\n\nexport type DateSeparator = { type: 'DateSeparator'; id: string; date: string }\n\nexport type ReplyShadowMessage = {\n type: 'ReplyShadowMessage'\n id: string\n messageId: string\n isReplyShadowMessage: boolean\n nextRendersAuthor: boolean\n}\n\nexport type EnrichedMessage = MessageResource | DateSeparator | ReplyShadowMessage\n\ninterface GroupMessagesProps {\n ms: MessageResource[]\n inReplyScreen?: boolean\n}\n\nexport function groupMessages({ ms, inReplyScreen }: GroupMessagesProps): EnrichedMessage[] {\n const items: EnrichedMessage[] = []\n let myLatestSeen = false\n let nextNeighborEnriched: MessageResource | undefined\n\n ms.forEach((message, i) => {\n const { prev } = neighborsOf(ms, i)\n const next = nextNeighborEnriched\n\n if (isSystemMessage(message)) {\n const enriched = enrichSystemMessage(message, next)\n items.push(enriched)\n if (datesDifferBetween(message, prev)) items.push(dateSeparator(message))\n nextNeighborEnriched = enriched\n return\n }\n\n const isMyLatest = !myLatestSeen && message.mine\n if (isMyLatest) myLatestSeen = true\n\n const enriched = enrichRegularMessage(message, prev, next, isMyLatest, !!inReplyScreen)\n items.push(enriched)\n\n const shadow = replyShadowFor(enriched, prev)\n if (shadow) items.push(shadow)\n\n if (!prev || datesDifferBetween(message, prev)) {\n items.push(dateSeparator(message))\n }\n\n nextNeighborEnriched = enriched\n })\n\n return items\n}\n\nfunction neighborsOf<T>(arr: T[], i: number): { prev: T | undefined; next: T | undefined } {\n return { prev: arr[i + 1], next: arr[i - 1] }\n}\n\nfunction enrichSystemMessage(\n message: MessageResource,\n next: MessageResource | undefined\n): MessageResource {\n return {\n ...message,\n myLatestInConversation: false,\n lastInGroup: true,\n renderAuthor: false,\n nextRendersAuthor: next?.renderAuthor,\n isReplyShadowMessage: false,\n nextIsReplyShadowMessage: false,\n threadPosition: null,\n }\n}\n\nfunction enrichRegularMessage(\n message: MessageResource,\n prev: MessageResource | undefined,\n next: MessageResource | undefined,\n isMyLatest: boolean,\n inReplyScreen: boolean\n): MessageResource {\n const inThread = message.replyRootId !== null\n const showThreadDetails = !inReplyScreen && inThread\n\n return {\n ...message,\n myLatestInConversation: isMyLatest,\n lastInGroup: !next || startsNewGroup(next, message),\n renderAuthor: !message.mine && (!prev || startsNewGroup(message, prev)),\n nextRendersAuthor: next?.renderAuthor,\n isReplyShadowMessage: false,\n nextIsReplyShadowMessage: nextIntroducesReplyShadow(next, message),\n threadPosition: showThreadDetails ? threadPositionFor(message, next) : null,\n prevIsMyReply: showThreadDetails ? prev?.mine : undefined,\n nextIsMyReply: showThreadDetails ? next?.mine : undefined,\n }\n}\n\nfunction startsNewGroup(a: MessageResource, b: MessageResource): boolean {\n return (\n a.author?.id !== b.author?.id ||\n differsByMoreThan5Min(a, b) ||\n a.replyRootId !== b.replyRootId ||\n datesDifferBetween(a, b)\n )\n}\n\nfunction differsByMoreThan5Min(a: MessageResource, b: MessageResource): boolean {\n return Math.abs(toMillis(a.createdAt) - toMillis(b.createdAt)) > FIVE_MINUTES_MS\n}\n\nfunction toMillis(iso: string): number {\n return new Date(iso).getTime()\n}\n\nfunction datesDifferBetween(a: MessageResource, b: MessageResource | undefined): boolean {\n if (!b) return false\n return dateKey(a) !== dateKey(b)\n}\n\nfunction dateKey(message: MessageResource): string {\n return dayjs(message.createdAt).format('YYYY-MM-DD')\n}\n\nfunction dateSeparator(message: MessageResource): DateSeparator {\n return { type: 'DateSeparator', id: `day-divider-${message.id}`, date: dateKey(message) }\n}\n\nfunction threadPositionFor(\n message: MessageResource,\n next: MessageResource | undefined\n): 'first' | 'center' | 'last' | null {\n const isThreadRoot = message.replyRootId === message.id\n const isLast =\n !next || next.replyRootId !== message.replyRootId || datesDifferBetween(next, message)\n\n if (isThreadRoot && isLast) return null\n if (isThreadRoot) return 'first'\n if (isLast) return 'last'\n return 'center'\n}\n\nfunction nextIntroducesReplyShadow(\n next: MessageResource | undefined,\n current: MessageResource\n): boolean {\n if (!next) return false\n const nextInThread = next.replyRootId !== null\n const nextIsThreadRoot = next.replyRootId === next.id\n const differentThread = next.replyRootId !== current.replyRootId\n return nextInThread && !nextIsThreadRoot && (differentThread || datesDifferBetween(next, current))\n}\n\nfunction replyShadowFor(\n message: MessageResource,\n prev: MessageResource | undefined\n): ReplyShadowMessage | undefined {\n if (!message.replyRootId) return undefined\n if (message.replyRootId === message.id) return undefined\n\n const enteringNewThread =\n !prev || prev.replyRootId !== message.replyRootId || datesDifferBetween(prev, message)\n if (!enteringNewThread) return undefined\n\n return {\n type: 'ReplyShadowMessage',\n id: `${message.id}-${message.replyRootId}`,\n messageId: message.replyRootId,\n isReplyShadowMessage: true,\n nextRendersAuthor: message.renderAuthor ?? false,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"group_messages.js","names":["dayjs","isSystemMessage","FIVE_MINUTES_MS","groupMessages","ms","inReplyScreen","items","messagesById","Map","map","message","id","myLatestSeen","nextNeighborEnriched","forEach","i","prev","neighborsOf","next","enriched","enrichSystemMessage","push","datesDifferBetween","dateSeparator","isMyLatest","mine","enrichRegularMessage","replyRoot","resolveReplyRoot","shadow","replyShadowFor","arr","replyRootId","get","myLatestInConversation","lastInGroup","renderAuthor","nextRendersAuthor","isReplyShadowMessage","nextIsReplyShadowMessage","threadPosition","inThread","showThreadDetails","startsNewGroup","nextIntroducesReplyShadow","threadPositionFor","prevIsMyReply","undefined","nextIsMyReply","a","b","author","differsByMoreThan5Min","Math","abs","toMillis","createdAt","iso","Date","getTime","dateKey","format","type","date","isThreadRoot","isLast","current","nextInThread","nextIsThreadRoot","differentThread","enteringNewThread","messageId"],"sources":["../../src/utils/group_messages.ts"],"sourcesContent":["import type { MessageResource } from '../types/resources/message'\nimport dayjs from './dayjs'\nimport { isSystemMessage } from './system_messages'\n\nconst FIVE_MINUTES_MS = 5 * 60 * 1000\n\nexport type DateSeparator = { type: 'DateSeparator'; id: string; date: string }\n\nexport type ReplyShadowMessage = {\n type: 'ReplyShadowMessage'\n id: string\n messageId: string\n replyRoot: MessageResource | null\n isReplyShadowMessage: boolean\n nextRendersAuthor: boolean\n}\n\nexport type EnrichedMessage = MessageResource | DateSeparator | ReplyShadowMessage\n\ninterface GroupMessagesProps {\n ms: MessageResource[]\n inReplyScreen?: boolean\n}\n\nexport function groupMessages({ ms, inReplyScreen }: GroupMessagesProps): EnrichedMessage[] {\n const items: EnrichedMessage[] = []\n const messagesById = new Map(ms.map(message => [message.id, message]))\n let myLatestSeen = false\n let nextNeighborEnriched: MessageResource | undefined\n\n ms.forEach((message, i) => {\n const { prev } = neighborsOf(ms, i)\n const next = nextNeighborEnriched\n\n if (isSystemMessage(message)) {\n const enriched = enrichSystemMessage(message, next)\n items.push(enriched)\n if (datesDifferBetween(message, prev)) items.push(dateSeparator(message))\n nextNeighborEnriched = enriched\n return\n }\n\n const isMyLatest = !myLatestSeen && message.mine\n if (isMyLatest) myLatestSeen = true\n\n const enriched = enrichRegularMessage(\n { ...message, replyRoot: resolveReplyRoot(message, messagesById) },\n prev,\n next,\n isMyLatest,\n !!inReplyScreen\n )\n items.push(enriched)\n\n const shadow = replyShadowFor(enriched, prev)\n if (shadow) items.push(shadow)\n\n if (!prev || datesDifferBetween(message, prev)) {\n items.push(dateSeparator(message))\n }\n\n nextNeighborEnriched = enriched\n })\n\n return items\n}\n\nfunction neighborsOf<T>(arr: T[], i: number): { prev: T | undefined; next: T | undefined } {\n return { prev: arr[i + 1], next: arr[i - 1] }\n}\n\nfunction resolveReplyRoot(\n message: MessageResource,\n messagesById: Map<string, MessageResource>\n): MessageResource | null {\n if (!message.replyRootId || message.replyRootId === message.id) return null\n return messagesById.get(message.replyRootId) ?? message.replyRoot ?? null\n}\n\nfunction enrichSystemMessage(\n message: MessageResource,\n next: MessageResource | undefined\n): MessageResource {\n return {\n ...message,\n myLatestInConversation: false,\n lastInGroup: true,\n renderAuthor: false,\n nextRendersAuthor: next?.renderAuthor,\n isReplyShadowMessage: false,\n nextIsReplyShadowMessage: false,\n threadPosition: null,\n }\n}\n\nfunction enrichRegularMessage(\n message: MessageResource,\n prev: MessageResource | undefined,\n next: MessageResource | undefined,\n isMyLatest: boolean,\n inReplyScreen: boolean\n): MessageResource {\n const inThread = message.replyRootId !== null\n const showThreadDetails = !inReplyScreen && inThread\n\n return {\n ...message,\n myLatestInConversation: isMyLatest,\n lastInGroup: !next || startsNewGroup(next, message),\n renderAuthor: !message.mine && (!prev || startsNewGroup(message, prev)),\n nextRendersAuthor: next?.renderAuthor,\n isReplyShadowMessage: false,\n nextIsReplyShadowMessage: nextIntroducesReplyShadow(next, message),\n threadPosition: showThreadDetails ? threadPositionFor(message, next) : null,\n prevIsMyReply: showThreadDetails ? prev?.mine : undefined,\n nextIsMyReply: showThreadDetails ? next?.mine : undefined,\n }\n}\n\nfunction startsNewGroup(a: MessageResource, b: MessageResource): boolean {\n return (\n a.author?.id !== b.author?.id ||\n differsByMoreThan5Min(a, b) ||\n a.replyRootId !== b.replyRootId ||\n datesDifferBetween(a, b)\n )\n}\n\nfunction differsByMoreThan5Min(a: MessageResource, b: MessageResource): boolean {\n return Math.abs(toMillis(a.createdAt) - toMillis(b.createdAt)) > FIVE_MINUTES_MS\n}\n\nfunction toMillis(iso: string): number {\n return new Date(iso).getTime()\n}\n\nfunction datesDifferBetween(a: MessageResource, b: MessageResource | undefined): boolean {\n if (!b) return false\n return dateKey(a) !== dateKey(b)\n}\n\nfunction dateKey(message: MessageResource): string {\n return dayjs(message.createdAt).format('YYYY-MM-DD')\n}\n\nfunction dateSeparator(message: MessageResource): DateSeparator {\n return { type: 'DateSeparator', id: `day-divider-${message.id}`, date: dateKey(message) }\n}\n\nfunction threadPositionFor(\n message: MessageResource,\n next: MessageResource | undefined\n): 'first' | 'center' | 'last' | null {\n const isThreadRoot = message.replyRootId === message.id\n const isLast =\n !next || next.replyRootId !== message.replyRootId || datesDifferBetween(next, message)\n\n if (isThreadRoot && isLast) return null\n if (isThreadRoot) return 'first'\n if (isLast) return 'last'\n return 'center'\n}\n\nfunction nextIntroducesReplyShadow(\n next: MessageResource | undefined,\n current: MessageResource\n): boolean {\n if (!next) return false\n const nextInThread = next.replyRootId !== null\n const nextIsThreadRoot = next.replyRootId === next.id\n const differentThread = next.replyRootId !== current.replyRootId\n return nextInThread && !nextIsThreadRoot && (differentThread || datesDifferBetween(next, current))\n}\n\nfunction replyShadowFor(\n message: MessageResource,\n prev: MessageResource | undefined\n): ReplyShadowMessage | undefined {\n if (!message.replyRootId) return undefined\n if (message.replyRootId === message.id) return undefined\n\n const enteringNewThread =\n !prev || prev.replyRootId !== message.replyRootId || datesDifferBetween(prev, message)\n if (!enteringNewThread) return undefined\n\n return {\n type: 'ReplyShadowMessage',\n id: `${message.id}-${message.replyRootId}`,\n messageId: message.replyRootId,\n replyRoot: message.replyRoot ?? null,\n isReplyShadowMessage: true,\n nextRendersAuthor: message.renderAuthor ?? false,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** replaceEqualById
|
|
2
|
+
* TanStack's default structural sharing compares arrays by index, so an insert or
|
|
3
|
+
* delete gives every shifted record a new identity. Match by id instead.
|
|
4
|
+
*/
|
|
5
|
+
export declare function replaceEqualById(oldData: unknown, newData: unknown): unknown;
|
|
6
|
+
//# sourceMappingURL=replace_equal_by_id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replace_equal_by_id.d.ts","sourceRoot":"","sources":["../../src/utils/replace_equal_by_id.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAgC5E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { replaceEqualDeep } from '@tanstack/react-query';
|
|
2
|
+
/** replaceEqualById
|
|
3
|
+
* TanStack's default structural sharing compares arrays by index, so an insert or
|
|
4
|
+
* delete gives every shifted record a new identity. Match by id instead.
|
|
5
|
+
*/
|
|
6
|
+
export function replaceEqualById(oldData, newData) {
|
|
7
|
+
const prev = oldData;
|
|
8
|
+
const next = newData;
|
|
9
|
+
if (!prev?.pages || !next?.pages) return replaceEqualDeep(prev, next);
|
|
10
|
+
const prevById = new Map();
|
|
11
|
+
prev.pages.forEach(page => page.data.forEach(record => prevById.set(record.id, record)));
|
|
12
|
+
let changed = prev.pages.length !== next.pages.length;
|
|
13
|
+
const pages = next.pages.map((page, index) => {
|
|
14
|
+
const prevPage = prev.pages[index];
|
|
15
|
+
const data = page.data.map(record => {
|
|
16
|
+
const previous = prevById.get(record.id);
|
|
17
|
+
return previous ? replaceEqualDeep(previous, record) : record;
|
|
18
|
+
});
|
|
19
|
+
const links = replaceEqualDeep(prevPage?.links, page.links);
|
|
20
|
+
const meta = replaceEqualDeep(prevPage?.meta, page.meta);
|
|
21
|
+
const sameRecords = !!prevPage && data.length === prevPage.data.length && data.every((record, i) => record === prevPage.data[i]);
|
|
22
|
+
if (prevPage && sameRecords && links === prevPage.links && meta === prevPage.meta) {
|
|
23
|
+
return prevPage;
|
|
24
|
+
}
|
|
25
|
+
changed = true;
|
|
26
|
+
return {
|
|
27
|
+
...page,
|
|
28
|
+
data,
|
|
29
|
+
links,
|
|
30
|
+
meta
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
const pageParams = replaceEqualDeep(prev.pageParams, next.pageParams);
|
|
34
|
+
if (!changed && pageParams === prev.pageParams) return prev;
|
|
35
|
+
return {
|
|
36
|
+
...next,
|
|
37
|
+
pages,
|
|
38
|
+
pageParams
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=replace_equal_by_id.js.map
|