@planningcenter/chat-react-native 4.3.0 → 4.4.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/screens/message_actions_screen.js +6 -2
- package/build/screens/message_actions_screen.js.map +1 -1
- package/build/screens/search/search_screen.d.ts.map +1 -1
- package/build/screens/search/search_screen.js +48 -23
- package/build/screens/search/search_screen.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/screens/message_actions_screen.test.tsx +136 -0
- package/src/screens/message_actions_screen.tsx +6 -2
- package/src/screens/search/__tests__/search_screen.test.tsx +76 -0
- package/src/screens/search/search_screen.tsx +22 -4
|
@@ -187,8 +187,12 @@ function MessageActionsScreenContent(t0) {
|
|
|
187
187
|
const handleReplyPress = t4;
|
|
188
188
|
let t5;
|
|
189
189
|
if ($[12] !== attachmentForCopy || $[13] !== message.text || $[14] !== navigation) {
|
|
190
|
-
t5 = () => {
|
|
191
|
-
|
|
190
|
+
t5 = async () => {
|
|
191
|
+
const textToCopy = message?.text || attachmentForCopy();
|
|
192
|
+
if (textToCopy) {
|
|
193
|
+
await Clipboard.setStringAsync(textToCopy);
|
|
194
|
+
Haptic.notificationSuccess();
|
|
195
|
+
}
|
|
192
196
|
navigation.goBack();
|
|
193
197
|
};
|
|
194
198
|
$[12] = attachmentForCopy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_actions_screen.js","names":["PlatformPressable","StackActions","useNavigation","useMutation","useQueryClient","isNil","omitBy","React","useCallback","Alert","Platform","StyleSheet","View","Text","useReactionStyles","FormSheet","getFormSheetScreenOptions","useCreateAndroidRippleColor","useFontScale","useTheme","useApiClient","useConversationMessages","availableFeatures","useFeatures","useMessageReactionToggle","REACTION_EMOJIS","applyMessageDeletionToCaches","getThreadedMessagesQueryKey","Clipboard","Haptic","jsx","_jsx","jsxs","_jsxs","MessageActionsScreenOptions","sheetAllowedDetents","headerTitle","MessageActionsScreen","t0","$","_c","route","conversation_id","message_id","canDeleteNonAuthoredMessages","inReplyScreen","reply_root_author_name","isSystemMessage","params","t1","t2","Symbol","for","refetchOnMount","messages","refetch","t3","t4","m","id","find","message","t5","MessageActionsScreenContent","refetchMessages","replyRootAuthorName","navigation","apiClient","queryClient","styles","useStyles","featureEnabled","attachments","_temp","expandedLink","hasExpandedLink","reactionCounts","myReactions","filter","_temp2","map","_temp3","Object","entries","value","emoji","mine","includes","availableReactions","giphyTitleLink","_temp4","titleLink","attachmentForCopy","replyRootId","goBack","requestAnimationFrame","navigate","reply_root_id","handleReplyPress","text","setStringAsync","handleCopyPress","t6","impactLight","handleReportPress","t7","handleReactionToggle","isPending","t8","url","chat","delete","deleteMessage","t9","t10","invalidateQueries","queryKey","notificationSuccess","t11","mutationFn","mutationKey","onSuccess","onError","_temp5","mutate","handleDeleteMessage","t12","alert","style","onPress","handleDeleteConfirm","t13","state","getState","targetRouteName","targetRoute","routes","r","name","editing_message_id","dispatch","popTo","handleEditPress","t14","params_0","handleViewReadReceiptsPress","t15","url_0","data","type","attributes","expanded_link_id","post","removeLinkPreview","t16","t17","_temp6","handleRemoveLinkPreview","t18","handleRemoveLinkPreviewConfirm","t19","message_reporting","showReportMessageAction","t20","formSheetContent","t21","reactionList","t22","reaction_1","index","Reaction","reaction","t23","children","t24","actions","Action","title","iconName","accessibilityHint","accessibilityRole","appearance","t25","Root","attachment_0","attachment","reaction_0","reactionStyles","colors","baseRippleColor","interaction","fillColorNeutral060","color","androidRippleColor","borderless","foreground","reactionEmoji","allowFontScaling","android_ripple","maxFontSizeMultiplier","fontScale","baseSize","Math","max","borderColorDefaultBase","reactionBtnSize","select","ios","android","create","paddingTop","flexDirection","justifyContent","alignItems","gap","paddingBottom","borderBottomColor","borderBottomWidth","height","width","borderWidth","borderRadius","overflow","fontSize","textAlign"],"sources":["../../src/screens/message_actions_screen.tsx"],"sourcesContent":["import { PlatformPressable } from '@react-navigation/elements'\nimport { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { isNil, omitBy } from 'lodash'\nimport React, { useCallback } from 'react'\nimport { Alert, Platform, StyleSheet, View } from 'react-native'\nimport { Text } from '../components'\nimport { useReactionStyles } from '../components/conversation/message_reaction'\nimport FormSheet, { getFormSheetScreenOptions } from '../components/primitive/form_sheet'\nimport { useCreateAndroidRippleColor, useFontScale, useTheme } from '../hooks'\nimport { useApiClient } from '../hooks/use_api_client'\nimport { useConversationMessages } from '../hooks/use_conversation_messages'\nimport { availableFeatures, useFeatures } from '../hooks/use_features'\nimport { useMessageReactionToggle } from '../hooks/use_message_reaction_toggle'\nimport { MessageResource } from '../types'\nimport { ReactionCountResource } from '../types/resources/reaction'\nimport { REACTION_EMOJIS } from '../utils'\nimport {\n applyMessageDeletionToCaches,\n getThreadedMessagesQueryKey,\n} from '../utils/cache/messages_cache'\nimport { Clipboard, Haptic } from '../utils/native_adapters'\n\nexport const MessageActionsScreenOptions = getFormSheetScreenOptions({\n sheetAllowedDetents: [0.5],\n headerTitle: 'Message actions',\n})\n\nexport type MessageActionsScreenProps = StaticScreenProps<{\n message_id: string\n reply_root_author_name?: string\n conversation_id: number\n canDeleteNonAuthoredMessages?: boolean\n inReplyScreen?: boolean\n isSystemMessage?: boolean\n}>\n\nexport function MessageActionsScreen({ route }: MessageActionsScreenProps) {\n const {\n conversation_id,\n message_id,\n canDeleteNonAuthoredMessages,\n inReplyScreen,\n reply_root_author_name,\n isSystemMessage,\n } = route.params\n\n const { messages, refetch } = useConversationMessages(\n { conversation_id },\n { refetchOnMount: false }\n )\n const message = messages.find(m => m.id === message_id)\n\n if (!message) return null\n\n return (\n <MessageActionsScreenContent\n message={message}\n conversation_id={conversation_id}\n canDeleteNonAuthoredMessages={canDeleteNonAuthoredMessages || false}\n refetchMessages={refetch}\n inReplyScreen={inReplyScreen}\n replyRootAuthorName={reply_root_author_name}\n isSystemMessage={isSystemMessage}\n />\n )\n}\n\nfunction MessageActionsScreenContent({\n message,\n conversation_id,\n canDeleteNonAuthoredMessages,\n refetchMessages,\n inReplyScreen,\n replyRootAuthorName,\n isSystemMessage,\n}: {\n message: MessageResource\n conversation_id: number\n canDeleteNonAuthoredMessages: boolean\n refetchMessages: () => void\n inReplyScreen?: boolean\n replyRootAuthorName?: string\n isSystemMessage?: boolean\n}) {\n const navigation = useNavigation()\n const apiClient = useApiClient()\n const queryClient = useQueryClient()\n const styles = useStyles()\n const { featureEnabled } = useFeatures()\n const expandedLink = message.attachments.find(attachment => attachment.type === 'ExpandedLink')\n const hasExpandedLink = !!expandedLink\n\n const myReactions = message?.reactionCounts\n .filter(reaction => reaction.mine)\n .map(reaction => reaction.value)\n\n const availableReactions = Object.entries(REACTION_EMOJIS).map(([value, emoji]) => {\n return {\n value: value as ReactionCountResource['value'],\n emoji,\n mine: myReactions?.includes(value as ReactionCountResource['value']),\n }\n })\n\n const attachmentForCopy = (): string => {\n const giphyTitleLink = message?.attachments.find(\n attachment => attachment.type === 'giphy'\n )?.titleLink\n\n if (giphyTitleLink) return giphyTitleLink\n return ''\n }\n\n const handleReplyPress = useCallback(() => {\n navigation.goBack()\n // Waits for the modal to be dismissed before pushing the reply screen\n requestAnimationFrame(() => {\n navigation.navigate('ConversationReply', {\n conversation_id,\n reply_root_id: message.replyRootId || message.id,\n reply_root_author_name: replyRootAuthorName,\n })\n })\n }, [navigation, conversation_id, message.id, message.replyRootId, replyRootAuthorName])\n\n const handleCopyPress = () => {\n Clipboard.setStringAsync(message?.text || attachmentForCopy() || '')\n navigation.goBack()\n }\n\n const handleReportPress = useCallback(() => {\n Haptic.impactLight()\n navigation.navigate('MessageReport', {\n conversation_id,\n message_id: message.id,\n })\n }, [navigation, conversation_id, message.id])\n\n const { handleReactionToggle, isPending } = useMessageReactionToggle({\n conversation_id,\n message,\n })\n\n const deleteMessage = useCallback(() => {\n const url = `/me/conversations/${conversation_id}/messages/${message.id}/`\n\n return apiClient.chat.delete({ url })\n }, [apiClient, conversation_id, message.id])\n\n const { mutate: handleDeleteMessage } = useMutation({\n mutationFn: deleteMessage,\n mutationKey: ['deleteMessage', message.id],\n onSuccess: () => {\n applyMessageDeletionToCaches(queryClient, conversation_id, message)\n if (message.replyRootId) {\n queryClient.invalidateQueries({\n queryKey: getThreadedMessagesQueryKey(conversation_id, message.replyRootId),\n })\n }\n refetchMessages()\n Haptic.notificationSuccess()\n },\n onError: () => {\n Alert.alert('Oops', 'We were unable to delete this message. Please try again.')\n },\n })\n\n const handleDeleteConfirm = useCallback(() => {\n Alert.alert('Delete message', 'Are you sure you want to permanently delete this message?', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: () => {\n handleDeleteMessage()\n navigation.goBack()\n },\n },\n ])\n }, [handleDeleteMessage, navigation])\n\n const handleEditPress = useCallback(() => {\n const state = navigation.getState?.()\n const targetRouteName = inReplyScreen ? 'ConversationReply' : 'Conversation'\n const targetRoute = state?.routes?.find(r => r.name === targetRouteName)\n const params = omitBy(\n {\n ...(targetRoute?.params || {}),\n conversation_id,\n editing_message_id: message.id,\n },\n isNil\n )\n navigation.dispatch(StackActions.popTo(targetRouteName, params))\n }, [navigation, conversation_id, message.id, inReplyScreen])\n\n const handleViewReadReceiptsPress = useCallback(() => {\n Haptic.impactLight()\n const params = omitBy(\n {\n conversation_id,\n message_id: message.id,\n },\n isNil\n )\n navigation.dispatch(StackActions.popTo('MessageReadReceipts', params))\n }, [navigation, conversation_id, message.id])\n\n const removeLinkPreview = useCallback(() => {\n const url = `/me/conversations/${conversation_id}/messages/${message.id}/remove_expanded_link`\n const data = {\n data: { type: 'ExpandedLink', attributes: { expanded_link_id: expandedLink?.id } },\n }\n\n return apiClient.chat.post({ url, data })\n }, [apiClient, conversation_id, message.id, expandedLink])\n\n const { mutate: handleRemoveLinkPreview } = useMutation({\n mutationFn: removeLinkPreview,\n onSuccess: () => {\n refetchMessages()\n Haptic.notificationSuccess()\n navigation.goBack()\n },\n onError: () => {\n Alert.alert('Oops', 'We were unable to remove the preview. Please try again.')\n },\n })\n\n const handleRemoveLinkPreviewConfirm = useCallback(() => {\n Alert.alert('Remove link preview?', 'This will remove the image preview but retain the link', [\n { text: 'Cancel', style: 'cancel' },\n { text: 'Remove', style: 'destructive', onPress: () => handleRemoveLinkPreview() },\n ])\n }, [handleRemoveLinkPreview])\n\n const showReportMessageAction =\n !message?.mine && featureEnabled(availableFeatures.message_reporting)\n\n return (\n <FormSheet.Root style={styles.formSheetContent}>\n <View style={styles.reactionList}>\n {availableReactions.map((reaction, index) => (\n <Reaction\n key={index}\n reaction={reaction}\n onPress={() => {\n Haptic.impactLight()\n handleReactionToggle({\n value: reaction.value,\n mine: reaction.mine,\n })\n navigation.goBack()\n }}\n />\n ))}\n </View>\n {!isSystemMessage && (\n <View style={styles.actions}>\n {!inReplyScreen && (\n <FormSheet.Action\n onPress={handleReplyPress}\n title=\"Reply to message\"\n iconName=\"registrations.undo\"\n accessibilityHint=\"Navigates to the reply screen\"\n accessibilityRole=\"link\"\n />\n )}\n <FormSheet.Action\n onPress={handleCopyPress}\n title=\"Copy text\"\n iconName=\"services.fileCopy\"\n accessibilityHint=\"Copies text and links to clipboard\"\n />\n {showReportMessageAction && (\n <FormSheet.Action\n onPress={handleReportPress}\n title=\"Report message\"\n iconName=\"chat.reportMessageO\"\n accessibilityHint=\"Opens a form to report this message\"\n />\n )}\n {message?.mine && (\n <FormSheet.Action\n onPress={() => handleEditPress()}\n title=\"Edit message\"\n iconName=\"accounts.editor\"\n accessibilityHint=\"Opens existing text in the message form input.\"\n />\n )}\n {message?.mine && (\n <FormSheet.Action\n onPress={() => handleViewReadReceiptsPress()}\n title=\"View read receipts\"\n iconName=\"general.checkPerson\"\n accessibilityHint=\"Opens a modal with a list of people who read your message.\"\n />\n )}\n {message?.mine && hasExpandedLink && (\n <FormSheet.Action\n onPress={() => handleRemoveLinkPreviewConfirm()}\n title=\"Remove link preview\"\n iconName=\"general.brokenLink\"\n accessibilityHint=\"Removes an expanded link preview from the message.\"\n />\n )}\n {(message?.mine || canDeleteNonAuthoredMessages) && (\n <FormSheet.Action\n onPress={() => handleDeleteConfirm()}\n title=\"Delete message\"\n iconName=\"publishing.trash\"\n appearance=\"danger\"\n disabled={isPending}\n accessibilityHint=\"Opens a confirmation alert to delete this message permanently.\"\n />\n )}\n </View>\n )}\n </FormSheet.Root>\n )\n}\n\nconst Reaction = ({\n reaction,\n onPress,\n}: {\n reaction: { value: ReactionCountResource['value']; emoji: string; mine: boolean | undefined }\n onPress: () => void\n}) => {\n const styles = useStyles()\n const reactionStyles = useReactionStyles({ mine: reaction.mine ? 1 : 0 })\n\n const { colors } = useTheme()\n const baseRippleColor = reaction.mine ? colors.interaction : colors.fillColorNeutral060\n const androidRippleColor = useCreateAndroidRippleColor({ color: baseRippleColor })\n\n return (\n <PlatformPressable\n key={reaction.value}\n style={[reactionStyles.reaction, styles.reaction]}\n android_ripple={{ color: androidRippleColor, borderless: false, foreground: true }}\n onPress={onPress}\n >\n <Text style={styles.reactionEmoji} allowFontScaling={false}>\n {REACTION_EMOJIS[reaction.value]}\n </Text>\n </PlatformPressable>\n )\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n const fontScale = useFontScale({ maxFontSizeMultiplier: 1.3 })\n\n const btnBorderWidth = 1\n const baseSize = 46 * Math.max(1, fontScale)\n const reactionBtnSize = Platform.select({\n ios: baseSize,\n android: baseSize + btnBorderWidth * 2,\n })\n\n return StyleSheet.create({\n formSheetContent: {\n paddingTop: 16,\n },\n reactionList: {\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 16,\n paddingTop: 8,\n paddingBottom: 16,\n borderBottomColor: colors.borderColorDefaultBase,\n borderBottomWidth: 1,\n },\n reaction: {\n height: reactionBtnSize,\n width: reactionBtnSize,\n borderWidth: btnBorderWidth,\n borderRadius: 32,\n justifyContent: 'center',\n overflow: 'hidden',\n },\n reactionEmoji: {\n fontSize: 24,\n textAlign: 'center',\n },\n actions: {\n paddingTop: 4,\n },\n })\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"message_actions_screen.js","names":["PlatformPressable","StackActions","useNavigation","useMutation","useQueryClient","isNil","omitBy","React","useCallback","Alert","Platform","StyleSheet","View","Text","useReactionStyles","FormSheet","getFormSheetScreenOptions","useCreateAndroidRippleColor","useFontScale","useTheme","useApiClient","useConversationMessages","availableFeatures","useFeatures","useMessageReactionToggle","REACTION_EMOJIS","applyMessageDeletionToCaches","getThreadedMessagesQueryKey","Clipboard","Haptic","jsx","_jsx","jsxs","_jsxs","MessageActionsScreenOptions","sheetAllowedDetents","headerTitle","MessageActionsScreen","t0","$","_c","route","conversation_id","message_id","canDeleteNonAuthoredMessages","inReplyScreen","reply_root_author_name","isSystemMessage","params","t1","t2","Symbol","for","refetchOnMount","messages","refetch","t3","t4","m","id","find","message","t5","MessageActionsScreenContent","refetchMessages","replyRootAuthorName","navigation","apiClient","queryClient","styles","useStyles","featureEnabled","attachments","_temp","expandedLink","hasExpandedLink","reactionCounts","myReactions","filter","_temp2","map","_temp3","Object","entries","value","emoji","mine","includes","availableReactions","giphyTitleLink","_temp4","titleLink","attachmentForCopy","replyRootId","goBack","requestAnimationFrame","navigate","reply_root_id","handleReplyPress","text","textToCopy","setStringAsync","notificationSuccess","handleCopyPress","t6","impactLight","handleReportPress","t7","handleReactionToggle","isPending","t8","url","chat","delete","deleteMessage","t9","t10","invalidateQueries","queryKey","t11","mutationFn","mutationKey","onSuccess","onError","_temp5","mutate","handleDeleteMessage","t12","alert","style","onPress","handleDeleteConfirm","t13","state","getState","targetRouteName","targetRoute","routes","r","name","editing_message_id","dispatch","popTo","handleEditPress","t14","params_0","handleViewReadReceiptsPress","t15","url_0","data","type","attributes","expanded_link_id","post","removeLinkPreview","t16","t17","_temp6","handleRemoveLinkPreview","t18","handleRemoveLinkPreviewConfirm","t19","message_reporting","showReportMessageAction","t20","formSheetContent","t21","reactionList","t22","reaction_1","index","Reaction","reaction","t23","children","t24","actions","Action","title","iconName","accessibilityHint","accessibilityRole","appearance","t25","Root","attachment_0","attachment","reaction_0","reactionStyles","colors","baseRippleColor","interaction","fillColorNeutral060","color","androidRippleColor","borderless","foreground","reactionEmoji","allowFontScaling","android_ripple","maxFontSizeMultiplier","fontScale","baseSize","Math","max","borderColorDefaultBase","reactionBtnSize","select","ios","android","create","paddingTop","flexDirection","justifyContent","alignItems","gap","paddingBottom","borderBottomColor","borderBottomWidth","height","width","borderWidth","borderRadius","overflow","fontSize","textAlign"],"sources":["../../src/screens/message_actions_screen.tsx"],"sourcesContent":["import { PlatformPressable } from '@react-navigation/elements'\nimport { StackActions, StaticScreenProps, useNavigation } from '@react-navigation/native'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { isNil, omitBy } from 'lodash'\nimport React, { useCallback } from 'react'\nimport { Alert, Platform, StyleSheet, View } from 'react-native'\nimport { Text } from '../components'\nimport { useReactionStyles } from '../components/conversation/message_reaction'\nimport FormSheet, { getFormSheetScreenOptions } from '../components/primitive/form_sheet'\nimport { useCreateAndroidRippleColor, useFontScale, useTheme } from '../hooks'\nimport { useApiClient } from '../hooks/use_api_client'\nimport { useConversationMessages } from '../hooks/use_conversation_messages'\nimport { availableFeatures, useFeatures } from '../hooks/use_features'\nimport { useMessageReactionToggle } from '../hooks/use_message_reaction_toggle'\nimport { MessageResource } from '../types'\nimport { ReactionCountResource } from '../types/resources/reaction'\nimport { REACTION_EMOJIS } from '../utils'\nimport {\n applyMessageDeletionToCaches,\n getThreadedMessagesQueryKey,\n} from '../utils/cache/messages_cache'\nimport { Clipboard, Haptic } from '../utils/native_adapters'\n\nexport const MessageActionsScreenOptions = getFormSheetScreenOptions({\n sheetAllowedDetents: [0.5],\n headerTitle: 'Message actions',\n})\n\nexport type MessageActionsScreenProps = StaticScreenProps<{\n message_id: string\n reply_root_author_name?: string\n conversation_id: number\n canDeleteNonAuthoredMessages?: boolean\n inReplyScreen?: boolean\n isSystemMessage?: boolean\n}>\n\nexport function MessageActionsScreen({ route }: MessageActionsScreenProps) {\n const {\n conversation_id,\n message_id,\n canDeleteNonAuthoredMessages,\n inReplyScreen,\n reply_root_author_name,\n isSystemMessage,\n } = route.params\n\n const { messages, refetch } = useConversationMessages(\n { conversation_id },\n { refetchOnMount: false }\n )\n const message = messages.find(m => m.id === message_id)\n\n if (!message) return null\n\n return (\n <MessageActionsScreenContent\n message={message}\n conversation_id={conversation_id}\n canDeleteNonAuthoredMessages={canDeleteNonAuthoredMessages || false}\n refetchMessages={refetch}\n inReplyScreen={inReplyScreen}\n replyRootAuthorName={reply_root_author_name}\n isSystemMessage={isSystemMessage}\n />\n )\n}\n\nfunction MessageActionsScreenContent({\n message,\n conversation_id,\n canDeleteNonAuthoredMessages,\n refetchMessages,\n inReplyScreen,\n replyRootAuthorName,\n isSystemMessage,\n}: {\n message: MessageResource\n conversation_id: number\n canDeleteNonAuthoredMessages: boolean\n refetchMessages: () => void\n inReplyScreen?: boolean\n replyRootAuthorName?: string\n isSystemMessage?: boolean\n}) {\n const navigation = useNavigation()\n const apiClient = useApiClient()\n const queryClient = useQueryClient()\n const styles = useStyles()\n const { featureEnabled } = useFeatures()\n const expandedLink = message.attachments.find(attachment => attachment.type === 'ExpandedLink')\n const hasExpandedLink = !!expandedLink\n\n const myReactions = message?.reactionCounts\n .filter(reaction => reaction.mine)\n .map(reaction => reaction.value)\n\n const availableReactions = Object.entries(REACTION_EMOJIS).map(([value, emoji]) => {\n return {\n value: value as ReactionCountResource['value'],\n emoji,\n mine: myReactions?.includes(value as ReactionCountResource['value']),\n }\n })\n\n const attachmentForCopy = (): string => {\n const giphyTitleLink = message?.attachments.find(\n attachment => attachment.type === 'giphy'\n )?.titleLink\n\n if (giphyTitleLink) return giphyTitleLink\n return ''\n }\n\n const handleReplyPress = useCallback(() => {\n navigation.goBack()\n // Waits for the modal to be dismissed before pushing the reply screen\n requestAnimationFrame(() => {\n navigation.navigate('ConversationReply', {\n conversation_id,\n reply_root_id: message.replyRootId || message.id,\n reply_root_author_name: replyRootAuthorName,\n })\n })\n }, [navigation, conversation_id, message.id, message.replyRootId, replyRootAuthorName])\n\n const handleCopyPress = async () => {\n const textToCopy = message?.text || attachmentForCopy()\n if (textToCopy) {\n await Clipboard.setStringAsync(textToCopy)\n Haptic.notificationSuccess()\n }\n navigation.goBack()\n }\n\n const handleReportPress = useCallback(() => {\n Haptic.impactLight()\n navigation.navigate('MessageReport', {\n conversation_id,\n message_id: message.id,\n })\n }, [navigation, conversation_id, message.id])\n\n const { handleReactionToggle, isPending } = useMessageReactionToggle({\n conversation_id,\n message,\n })\n\n const deleteMessage = useCallback(() => {\n const url = `/me/conversations/${conversation_id}/messages/${message.id}/`\n\n return apiClient.chat.delete({ url })\n }, [apiClient, conversation_id, message.id])\n\n const { mutate: handleDeleteMessage } = useMutation({\n mutationFn: deleteMessage,\n mutationKey: ['deleteMessage', message.id],\n onSuccess: () => {\n applyMessageDeletionToCaches(queryClient, conversation_id, message)\n if (message.replyRootId) {\n queryClient.invalidateQueries({\n queryKey: getThreadedMessagesQueryKey(conversation_id, message.replyRootId),\n })\n }\n refetchMessages()\n Haptic.notificationSuccess()\n },\n onError: () => {\n Alert.alert('Oops', 'We were unable to delete this message. Please try again.')\n },\n })\n\n const handleDeleteConfirm = useCallback(() => {\n Alert.alert('Delete message', 'Are you sure you want to permanently delete this message?', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: () => {\n handleDeleteMessage()\n navigation.goBack()\n },\n },\n ])\n }, [handleDeleteMessage, navigation])\n\n const handleEditPress = useCallback(() => {\n const state = navigation.getState?.()\n const targetRouteName = inReplyScreen ? 'ConversationReply' : 'Conversation'\n const targetRoute = state?.routes?.find(r => r.name === targetRouteName)\n const params = omitBy(\n {\n ...(targetRoute?.params || {}),\n conversation_id,\n editing_message_id: message.id,\n },\n isNil\n )\n navigation.dispatch(StackActions.popTo(targetRouteName, params))\n }, [navigation, conversation_id, message.id, inReplyScreen])\n\n const handleViewReadReceiptsPress = useCallback(() => {\n Haptic.impactLight()\n const params = omitBy(\n {\n conversation_id,\n message_id: message.id,\n },\n isNil\n )\n navigation.dispatch(StackActions.popTo('MessageReadReceipts', params))\n }, [navigation, conversation_id, message.id])\n\n const removeLinkPreview = useCallback(() => {\n const url = `/me/conversations/${conversation_id}/messages/${message.id}/remove_expanded_link`\n const data = {\n data: { type: 'ExpandedLink', attributes: { expanded_link_id: expandedLink?.id } },\n }\n\n return apiClient.chat.post({ url, data })\n }, [apiClient, conversation_id, message.id, expandedLink])\n\n const { mutate: handleRemoveLinkPreview } = useMutation({\n mutationFn: removeLinkPreview,\n onSuccess: () => {\n refetchMessages()\n Haptic.notificationSuccess()\n navigation.goBack()\n },\n onError: () => {\n Alert.alert('Oops', 'We were unable to remove the preview. Please try again.')\n },\n })\n\n const handleRemoveLinkPreviewConfirm = useCallback(() => {\n Alert.alert('Remove link preview?', 'This will remove the image preview but retain the link', [\n { text: 'Cancel', style: 'cancel' },\n { text: 'Remove', style: 'destructive', onPress: () => handleRemoveLinkPreview() },\n ])\n }, [handleRemoveLinkPreview])\n\n const showReportMessageAction =\n !message?.mine && featureEnabled(availableFeatures.message_reporting)\n\n return (\n <FormSheet.Root style={styles.formSheetContent}>\n <View style={styles.reactionList}>\n {availableReactions.map((reaction, index) => (\n <Reaction\n key={index}\n reaction={reaction}\n onPress={() => {\n Haptic.impactLight()\n handleReactionToggle({\n value: reaction.value,\n mine: reaction.mine,\n })\n navigation.goBack()\n }}\n />\n ))}\n </View>\n {!isSystemMessage && (\n <View style={styles.actions}>\n {!inReplyScreen && (\n <FormSheet.Action\n onPress={handleReplyPress}\n title=\"Reply to message\"\n iconName=\"registrations.undo\"\n accessibilityHint=\"Navigates to the reply screen\"\n accessibilityRole=\"link\"\n />\n )}\n <FormSheet.Action\n onPress={handleCopyPress}\n title=\"Copy text\"\n iconName=\"services.fileCopy\"\n accessibilityHint=\"Copies text and links to clipboard\"\n />\n {showReportMessageAction && (\n <FormSheet.Action\n onPress={handleReportPress}\n title=\"Report message\"\n iconName=\"chat.reportMessageO\"\n accessibilityHint=\"Opens a form to report this message\"\n />\n )}\n {message?.mine && (\n <FormSheet.Action\n onPress={() => handleEditPress()}\n title=\"Edit message\"\n iconName=\"accounts.editor\"\n accessibilityHint=\"Opens existing text in the message form input.\"\n />\n )}\n {message?.mine && (\n <FormSheet.Action\n onPress={() => handleViewReadReceiptsPress()}\n title=\"View read receipts\"\n iconName=\"general.checkPerson\"\n accessibilityHint=\"Opens a modal with a list of people who read your message.\"\n />\n )}\n {message?.mine && hasExpandedLink && (\n <FormSheet.Action\n onPress={() => handleRemoveLinkPreviewConfirm()}\n title=\"Remove link preview\"\n iconName=\"general.brokenLink\"\n accessibilityHint=\"Removes an expanded link preview from the message.\"\n />\n )}\n {(message?.mine || canDeleteNonAuthoredMessages) && (\n <FormSheet.Action\n onPress={() => handleDeleteConfirm()}\n title=\"Delete message\"\n iconName=\"publishing.trash\"\n appearance=\"danger\"\n disabled={isPending}\n accessibilityHint=\"Opens a confirmation alert to delete this message permanently.\"\n />\n )}\n </View>\n )}\n </FormSheet.Root>\n )\n}\n\nconst Reaction = ({\n reaction,\n onPress,\n}: {\n reaction: { value: ReactionCountResource['value']; emoji: string; mine: boolean | undefined }\n onPress: () => void\n}) => {\n const styles = useStyles()\n const reactionStyles = useReactionStyles({ mine: reaction.mine ? 1 : 0 })\n\n const { colors } = useTheme()\n const baseRippleColor = reaction.mine ? colors.interaction : colors.fillColorNeutral060\n const androidRippleColor = useCreateAndroidRippleColor({ color: baseRippleColor })\n\n return (\n <PlatformPressable\n key={reaction.value}\n style={[reactionStyles.reaction, styles.reaction]}\n android_ripple={{ color: androidRippleColor, borderless: false, foreground: true }}\n onPress={onPress}\n >\n <Text style={styles.reactionEmoji} allowFontScaling={false}>\n {REACTION_EMOJIS[reaction.value]}\n </Text>\n </PlatformPressable>\n )\n}\n\nconst useStyles = () => {\n const { colors } = useTheme()\n const fontScale = useFontScale({ maxFontSizeMultiplier: 1.3 })\n\n const btnBorderWidth = 1\n const baseSize = 46 * Math.max(1, fontScale)\n const reactionBtnSize = Platform.select({\n ios: baseSize,\n android: baseSize + btnBorderWidth * 2,\n })\n\n return StyleSheet.create({\n formSheetContent: {\n paddingTop: 16,\n },\n reactionList: {\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 16,\n paddingTop: 8,\n paddingBottom: 16,\n borderBottomColor: colors.borderColorDefaultBase,\n borderBottomWidth: 1,\n },\n reaction: {\n height: reactionBtnSize,\n width: reactionBtnSize,\n borderWidth: btnBorderWidth,\n borderRadius: 32,\n justifyContent: 'center',\n overflow: 'hidden',\n },\n reactionEmoji: {\n fontSize: 24,\n textAlign: 'center',\n },\n actions: {\n paddingTop: 4,\n },\n })\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search_screen.d.ts","sourceRoot":"","sources":["../../../src/screens/search/search_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"search_screen.d.ts","sourceRoot":"","sources":["../../../src/screens/search/search_screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAiB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACvB,MAAM,gCAAgC,CAAA;AAcvC,eAAO,MAAM,mBAAmB,GAAI,iBAEjC,sBAAsB,CAAC,aAAa,CAAC,KAAG,4BAIxC,CAAA;AAEH,wBAAgB,YAAY,4CAkC3B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c as _c } from "react/compiler-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useNavigation } from '@react-navigation/native';
|
|
3
3
|
import React, { useState } from 'react';
|
|
4
|
-
import { StyleSheet, View } from 'react-native';
|
|
4
|
+
import { Keyboard, StyleSheet, View } from 'react-native';
|
|
5
5
|
import { KeyboardView } from '../../components';
|
|
6
6
|
import { composeOptions, withMinimalBack } from '../../components/display/platform_modal_header_buttons';
|
|
7
7
|
import { useDebouncedSearchTerm } from '../../hooks/use_debounced_search_term';
|
|
@@ -18,47 +18,72 @@ export const SearchScreenOptions = ({
|
|
|
18
18
|
onPress: () => navigation.goBack()
|
|
19
19
|
}));
|
|
20
20
|
export function SearchScreen() {
|
|
21
|
-
const $ = _c(
|
|
21
|
+
const $ = _c(10);
|
|
22
|
+
const navigation = useNavigation();
|
|
22
23
|
const [term, setTerm] = useState("");
|
|
23
24
|
const debouncedTerm = useDebouncedSearchTerm(term);
|
|
24
25
|
let t0;
|
|
25
|
-
if ($[0] !==
|
|
26
|
-
t0 =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
if ($[0] !== navigation) {
|
|
27
|
+
t0 = result => {
|
|
28
|
+
Keyboard.dismiss();
|
|
29
|
+
if (result.type === "conversation") {
|
|
30
|
+
navigation.navigate("Conversation", {
|
|
31
|
+
conversation_id: Number(result.id),
|
|
32
|
+
title: result.title
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
navigation.navigate("Conversation", {
|
|
36
|
+
conversation_id: result.extra.conversationId,
|
|
37
|
+
initial_message_id: result.id,
|
|
38
|
+
title: result.title
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
$[0] = navigation;
|
|
31
43
|
$[1] = t0;
|
|
32
44
|
} else {
|
|
33
45
|
t0 = $[1];
|
|
34
46
|
}
|
|
47
|
+
const openResult = t0;
|
|
35
48
|
let t1;
|
|
36
|
-
if ($[2] !==
|
|
37
|
-
t1 =
|
|
38
|
-
term:
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
$[2] =
|
|
49
|
+
if ($[2] !== term) {
|
|
50
|
+
t1 = /*#__PURE__*/_jsx(SearchField, {
|
|
51
|
+
term: term,
|
|
52
|
+
onChange: setTerm
|
|
53
|
+
});
|
|
54
|
+
$[2] = term;
|
|
42
55
|
$[3] = t1;
|
|
43
56
|
} else {
|
|
44
57
|
t1 = $[3];
|
|
45
58
|
}
|
|
46
59
|
let t2;
|
|
47
|
-
if ($[4] !==
|
|
48
|
-
t2 = /*#__PURE__*/_jsx(
|
|
60
|
+
if ($[4] !== debouncedTerm || $[5] !== openResult) {
|
|
61
|
+
t2 = debouncedTerm.length > 0 ? /*#__PURE__*/_jsx(SearchResultsList, {
|
|
62
|
+
term: debouncedTerm,
|
|
63
|
+
onSelect: openResult
|
|
64
|
+
}, debouncedTerm) : /*#__PURE__*/_jsx(SearchPromptBlankState, {});
|
|
65
|
+
$[4] = debouncedTerm;
|
|
66
|
+
$[5] = openResult;
|
|
67
|
+
$[6] = t2;
|
|
68
|
+
} else {
|
|
69
|
+
t2 = $[6];
|
|
70
|
+
}
|
|
71
|
+
let t3;
|
|
72
|
+
if ($[7] !== t1 || $[8] !== t2) {
|
|
73
|
+
t3 = /*#__PURE__*/_jsx(KeyboardView, {
|
|
49
74
|
children: /*#__PURE__*/_jsxs(View, {
|
|
50
75
|
style: styles.container,
|
|
51
76
|
testID: "search-screen",
|
|
52
|
-
children: [
|
|
77
|
+
children: [t1, t2]
|
|
53
78
|
})
|
|
54
79
|
});
|
|
55
|
-
$[
|
|
56
|
-
$[
|
|
57
|
-
$[
|
|
80
|
+
$[7] = t1;
|
|
81
|
+
$[8] = t2;
|
|
82
|
+
$[9] = t3;
|
|
58
83
|
} else {
|
|
59
|
-
|
|
84
|
+
t3 = $[9];
|
|
60
85
|
}
|
|
61
|
-
return
|
|
86
|
+
return t3;
|
|
62
87
|
}
|
|
63
88
|
const styles = StyleSheet.create({
|
|
64
89
|
container: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search_screen.js","names":["
|
|
1
|
+
{"version":3,"file":"search_screen.js","names":["useNavigation","React","useState","Keyboard","StyleSheet","View","KeyboardView","composeOptions","withMinimalBack","useDebouncedSearchTerm","SearchPromptBlankState","SearchField","SearchResultsList","jsx","_jsx","jsxs","_jsxs","SearchScreenOptions","navigation","title","animation","onPress","goBack","SearchScreen","$","_c","term","setTerm","debouncedTerm","t0","result","dismiss","type","navigate","conversation_id","Number","id","extra","conversationId","initial_message_id","openResult","t1","t2","length","t3","children","style","styles","container","testID","create","flex"],"sources":["../../../src/screens/search/search_screen.tsx"],"sourcesContent":["import { ParamListBase, useNavigation } from '@react-navigation/native'\nimport {\n NativeStackNavigationOptions,\n NativeStackScreenProps,\n} from '@react-navigation/native-stack'\nimport React, { useState } from 'react'\nimport { Keyboard, StyleSheet, View } from 'react-native'\nimport { KeyboardView } from '../../components'\nimport {\n composeOptions,\n withMinimalBack,\n} from '../../components/display/platform_modal_header_buttons'\nimport { useDebouncedSearchTerm } from '../../hooks/use_debounced_search_term'\nimport type { SearchResultResource } from '../../types/resources/search_result'\nimport { SearchPromptBlankState } from './components/search_blank_states'\nimport { SearchField } from './components/search_field'\nimport { SearchResultsList } from './components/search_results_list'\n\nexport const SearchScreenOptions = ({\n navigation,\n}: NativeStackScreenProps<ParamListBase>): NativeStackNavigationOptions =>\n composeOptions(\n { title: 'Search', animation: 'fade' },\n withMinimalBack({ onPress: () => navigation.goBack() })\n )\n\nexport function SearchScreen() {\n const navigation = useNavigation()\n const [term, setTerm] = useState('')\n const debouncedTerm = useDebouncedSearchTerm(term)\n\n const openResult = (result: SearchResultResource) => {\n Keyboard.dismiss()\n\n if (result.type === 'conversation') {\n navigation.navigate('Conversation', {\n conversation_id: Number(result.id),\n title: result.title,\n })\n } else {\n navigation.navigate('Conversation', {\n conversation_id: result.extra.conversationId,\n initial_message_id: result.id,\n title: result.title,\n })\n }\n }\n\n return (\n <KeyboardView>\n <View style={styles.container} testID=\"search-screen\">\n <SearchField term={term} onChange={setTerm} />\n {debouncedTerm.length > 0 ? (\n <SearchResultsList key={debouncedTerm} term={debouncedTerm} onSelect={openResult} />\n ) : (\n <SearchPromptBlankState />\n )}\n </View>\n </KeyboardView>\n )\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\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.
|
|
3
|
+
"version": "4.4.0-rc.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
"sf-symbols-typescript": "^2.2.0",
|
|
85
85
|
"typescript": "~6.0.3"
|
|
86
86
|
},
|
|
87
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "0539b5f633f3d60712eb79c502ca354180a9f0ac"
|
|
88
88
|
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { HeaderHeightContext } from '@react-navigation/elements'
|
|
2
|
+
import { DefaultTheme, ThemeProvider } from '@react-navigation/native'
|
|
3
|
+
import { QueryClientProvider } from '@tanstack/react-query'
|
|
4
|
+
import { fireEvent, render, waitFor } from '@testing-library/react-native'
|
|
5
|
+
import React from 'react'
|
|
6
|
+
import { SafeAreaProvider } from 'react-native-safe-area-context'
|
|
7
|
+
import { buildTestQueryClient } from '../../__utils__/query_client'
|
|
8
|
+
import {
|
|
9
|
+
MessageActionsScreen,
|
|
10
|
+
MessageActionsScreenProps,
|
|
11
|
+
} from '../../screens/message_actions_screen'
|
|
12
|
+
import { MessageResource } from '../../types'
|
|
13
|
+
import {
|
|
14
|
+
AudioAdapter,
|
|
15
|
+
ChatAdapters,
|
|
16
|
+
ClipboardAdapter,
|
|
17
|
+
HapticAdapter,
|
|
18
|
+
ImagePickerAdapter,
|
|
19
|
+
VideoAdapter,
|
|
20
|
+
} from '../../utils/native_adapters'
|
|
21
|
+
|
|
22
|
+
const mockMessage: MessageResource = {
|
|
23
|
+
type: 'Message',
|
|
24
|
+
id: '1',
|
|
25
|
+
text: 'Copy me',
|
|
26
|
+
html: '<p>Copy me</p>',
|
|
27
|
+
createdAt: '2026-01-01T00:00:00Z',
|
|
28
|
+
deletedAt: null,
|
|
29
|
+
textEditedAt: null,
|
|
30
|
+
mine: false,
|
|
31
|
+
attachments: [],
|
|
32
|
+
author: { id: 1, type: 'Person', name: 'Author', avatar: '' },
|
|
33
|
+
reactionCounts: [],
|
|
34
|
+
replyCount: 0,
|
|
35
|
+
replyRootId: null,
|
|
36
|
+
messageType: 'user',
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let mockCurrentMessage = mockMessage
|
|
40
|
+
|
|
41
|
+
const mockGoBack = jest.fn()
|
|
42
|
+
jest.mock('@react-navigation/native', () => ({
|
|
43
|
+
...jest.requireActual('@react-navigation/native'),
|
|
44
|
+
useNavigation: () => ({ navigate: jest.fn(), dispatch: jest.fn(), goBack: mockGoBack }),
|
|
45
|
+
}))
|
|
46
|
+
jest.mock('../../hooks/use_api_client', () => ({ useApiClient: () => ({}) }))
|
|
47
|
+
jest.mock('../../hooks/use_features', () => ({
|
|
48
|
+
...jest.requireActual('../../hooks/use_features'),
|
|
49
|
+
useFeatures: () => ({ features: [], featureEnabled: () => false }),
|
|
50
|
+
}))
|
|
51
|
+
jest.mock('../../hooks/use_message_reaction_toggle', () => ({
|
|
52
|
+
useMessageReactionToggle: () => ({ handleReactionToggle: jest.fn(), isPending: false }),
|
|
53
|
+
}))
|
|
54
|
+
jest.mock('../../hooks/use_conversation_messages', () => ({
|
|
55
|
+
useConversationMessages: () => ({ messages: [mockCurrentMessage], refetch: jest.fn() }),
|
|
56
|
+
}))
|
|
57
|
+
|
|
58
|
+
const setStringAsync = jest.fn(async (_: string) => {})
|
|
59
|
+
const notificationSuccess = jest.fn()
|
|
60
|
+
|
|
61
|
+
const safeAreaMetrics = {
|
|
62
|
+
frame: { x: 0, y: 0, width: 390, height: 844 },
|
|
63
|
+
insets: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const route = {
|
|
67
|
+
key: 'MessageActions',
|
|
68
|
+
name: 'MessageActions',
|
|
69
|
+
params: { conversation_id: 1, message_id: mockMessage.id },
|
|
70
|
+
} as MessageActionsScreenProps['route']
|
|
71
|
+
|
|
72
|
+
const renderScreen = () =>
|
|
73
|
+
render(
|
|
74
|
+
<QueryClientProvider client={buildTestQueryClient()}>
|
|
75
|
+
<SafeAreaProvider initialMetrics={safeAreaMetrics}>
|
|
76
|
+
<ThemeProvider value={DefaultTheme}>
|
|
77
|
+
<HeaderHeightContext.Provider value={0}>
|
|
78
|
+
<MessageActionsScreen route={route} />
|
|
79
|
+
</HeaderHeightContext.Provider>
|
|
80
|
+
</ThemeProvider>
|
|
81
|
+
</SafeAreaProvider>
|
|
82
|
+
</QueryClientProvider>
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
describe('MessageActionsScreen', () => {
|
|
86
|
+
beforeAll(() => {
|
|
87
|
+
ChatAdapters.configure({
|
|
88
|
+
clipboard: new ClipboardAdapter({ getStringAsync: async () => '', setStringAsync }),
|
|
89
|
+
audio: new AudioAdapter({ useAudio: () => ({}) as any }),
|
|
90
|
+
video: new VideoAdapter({ Player: React.forwardRef(() => null) }),
|
|
91
|
+
imagePicker: new ImagePickerAdapter({
|
|
92
|
+
openCameraAsync: async () => ({ canceled: true, assets: null }),
|
|
93
|
+
openImageLibraryAsync: async () => ({ canceled: true, assets: null }),
|
|
94
|
+
}),
|
|
95
|
+
haptic: new HapticAdapter({
|
|
96
|
+
impactLight: jest.fn(),
|
|
97
|
+
impactMedium: jest.fn(),
|
|
98
|
+
impactHeavy: jest.fn(),
|
|
99
|
+
rigid: jest.fn(),
|
|
100
|
+
soft: jest.fn(),
|
|
101
|
+
notificationSuccess,
|
|
102
|
+
notificationWarning: jest.fn(),
|
|
103
|
+
notificationError: jest.fn(),
|
|
104
|
+
}),
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
beforeEach(() => {
|
|
109
|
+
jest.clearAllMocks()
|
|
110
|
+
mockCurrentMessage = mockMessage
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
it('copies the message text and gives success haptic feedback before closing', async () => {
|
|
114
|
+
const { getByText } = renderScreen()
|
|
115
|
+
|
|
116
|
+
fireEvent.press(getByText('Copy text'))
|
|
117
|
+
|
|
118
|
+
expect(setStringAsync).toHaveBeenCalledWith('Copy me')
|
|
119
|
+
await waitFor(() => expect(mockGoBack).toHaveBeenCalledTimes(1))
|
|
120
|
+
expect(notificationSuccess).toHaveBeenCalledTimes(1)
|
|
121
|
+
expect(notificationSuccess.mock.invocationCallOrder[0]).toBeLessThan(
|
|
122
|
+
mockGoBack.mock.invocationCallOrder[0]
|
|
123
|
+
)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it('leaves the clipboard alone and gives no haptic when there is nothing to copy', async () => {
|
|
127
|
+
mockCurrentMessage = { ...mockMessage, text: null }
|
|
128
|
+
const { getByText } = renderScreen()
|
|
129
|
+
|
|
130
|
+
fireEvent.press(getByText('Copy text'))
|
|
131
|
+
|
|
132
|
+
await waitFor(() => expect(mockGoBack).toHaveBeenCalledTimes(1))
|
|
133
|
+
expect(setStringAsync).not.toHaveBeenCalled()
|
|
134
|
+
expect(notificationSuccess).not.toHaveBeenCalled()
|
|
135
|
+
})
|
|
136
|
+
})
|
|
@@ -124,8 +124,12 @@ function MessageActionsScreenContent({
|
|
|
124
124
|
})
|
|
125
125
|
}, [navigation, conversation_id, message.id, message.replyRootId, replyRootAuthorName])
|
|
126
126
|
|
|
127
|
-
const handleCopyPress = () => {
|
|
128
|
-
|
|
127
|
+
const handleCopyPress = async () => {
|
|
128
|
+
const textToCopy = message?.text || attachmentForCopy()
|
|
129
|
+
if (textToCopy) {
|
|
130
|
+
await Clipboard.setStringAsync(textToCopy)
|
|
131
|
+
Haptic.notificationSuccess()
|
|
132
|
+
}
|
|
129
133
|
navigation.goBack()
|
|
130
134
|
}
|
|
131
135
|
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { act, fireEvent, render } from '@testing-library/react-native'
|
|
2
2
|
import React from 'react'
|
|
3
|
+
import { Keyboard } from 'react-native'
|
|
3
4
|
import type { useSearchResults } from '../../../hooks/use_search_results'
|
|
5
|
+
import type {
|
|
6
|
+
ConversationSearchResultResource,
|
|
7
|
+
MessageSearchResultResource,
|
|
8
|
+
} from '../../../types/resources/search_result'
|
|
4
9
|
import { SearchScreen } from '../search_screen'
|
|
5
10
|
|
|
11
|
+
const mockNavigate = jest.fn()
|
|
12
|
+
jest.mock('@react-navigation/native', () => ({
|
|
13
|
+
...jest.requireActual('@react-navigation/native'),
|
|
14
|
+
useNavigation: () => ({ navigate: mockNavigate }),
|
|
15
|
+
}))
|
|
16
|
+
|
|
6
17
|
const mockUseSearchResults = jest.fn<ReturnType<typeof useSearchResults>, [string]>()
|
|
7
18
|
jest.mock('../../../hooks/use_search_results', () => ({
|
|
8
19
|
useSearchResults: (term: string) => mockUseSearchResults(term),
|
|
@@ -14,8 +25,48 @@ jest.mock('../../../components/display/keyboard_view', () => ({
|
|
|
14
25
|
|
|
15
26
|
const inputLabel = 'Search titles and messages'
|
|
16
27
|
|
|
28
|
+
const conversationResult: ConversationSearchResultResource = {
|
|
29
|
+
type: 'conversation',
|
|
30
|
+
id: '42',
|
|
31
|
+
title: 'Budget Team',
|
|
32
|
+
url: '/conversations/42',
|
|
33
|
+
extra: { avatar: { previewAvatarUrls: [] } },
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const messageResult: MessageSearchResultResource = {
|
|
37
|
+
type: 'message',
|
|
38
|
+
id: '01JMESSAGEULID',
|
|
39
|
+
title: 'Finance',
|
|
40
|
+
url: '/conversations/7/messages/01JMESSAGEULID',
|
|
41
|
+
extra: {
|
|
42
|
+
conversationId: 7,
|
|
43
|
+
authorName: 'Ann',
|
|
44
|
+
snippet: [{ text: 'budget', match: true }],
|
|
45
|
+
createdAt: '2026-01-01T00:00:00Z',
|
|
46
|
+
avatar: { previewAvatarUrls: [] },
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const renderWithResults = () => {
|
|
51
|
+
mockUseSearchResults.mockReturnValue({
|
|
52
|
+
results: [conversationResult, messageResult],
|
|
53
|
+
failedTypes: [],
|
|
54
|
+
isPending: false,
|
|
55
|
+
isError: false,
|
|
56
|
+
isFetchNextPageError: false,
|
|
57
|
+
loadMore: jest.fn(),
|
|
58
|
+
hasNextPage: false,
|
|
59
|
+
isFetchingNextPage: false,
|
|
60
|
+
})
|
|
61
|
+
const view = render(<SearchScreen />)
|
|
62
|
+
fireEvent.changeText(view.getByLabelText(inputLabel), 'budget')
|
|
63
|
+
act(() => jest.advanceTimersByTime(200))
|
|
64
|
+
return view
|
|
65
|
+
}
|
|
66
|
+
|
|
17
67
|
beforeEach(() => {
|
|
18
68
|
jest.useFakeTimers()
|
|
69
|
+
mockNavigate.mockReset()
|
|
19
70
|
mockUseSearchResults.mockReset().mockReturnValue({
|
|
20
71
|
results: [],
|
|
21
72
|
failedTypes: [],
|
|
@@ -61,4 +112,29 @@ describe('SearchScreen', () => {
|
|
|
61
112
|
|
|
62
113
|
expect(view.getByText('Search chat')).toBeTruthy()
|
|
63
114
|
})
|
|
115
|
+
|
|
116
|
+
it('opens a conversation result at the latest message', () => {
|
|
117
|
+
const dismiss = jest.spyOn(Keyboard, 'dismiss')
|
|
118
|
+
const view = renderWithResults()
|
|
119
|
+
|
|
120
|
+
fireEvent.press(view.getByLabelText('Budget Team'))
|
|
121
|
+
|
|
122
|
+
expect(dismiss).toHaveBeenCalled()
|
|
123
|
+
expect(mockNavigate).toHaveBeenCalledWith('Conversation', {
|
|
124
|
+
conversation_id: 42,
|
|
125
|
+
title: 'Budget Team',
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
it('opens a message result anchored at that message', () => {
|
|
130
|
+
const view = renderWithResults()
|
|
131
|
+
|
|
132
|
+
fireEvent.press(view.getByLabelText(/^Finance, Ann: budget/))
|
|
133
|
+
|
|
134
|
+
expect(mockNavigate).toHaveBeenCalledWith('Conversation', {
|
|
135
|
+
conversation_id: 7,
|
|
136
|
+
initial_message_id: '01JMESSAGEULID',
|
|
137
|
+
title: 'Finance',
|
|
138
|
+
})
|
|
139
|
+
})
|
|
64
140
|
})
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { ParamListBase } from '@react-navigation/native'
|
|
1
|
+
import { ParamListBase, useNavigation } from '@react-navigation/native'
|
|
2
2
|
import {
|
|
3
3
|
NativeStackNavigationOptions,
|
|
4
4
|
NativeStackScreenProps,
|
|
5
5
|
} from '@react-navigation/native-stack'
|
|
6
|
-
import { noop } from 'lodash'
|
|
7
6
|
import React, { useState } from 'react'
|
|
8
|
-
import { StyleSheet, View } from 'react-native'
|
|
7
|
+
import { Keyboard, StyleSheet, View } from 'react-native'
|
|
9
8
|
import { KeyboardView } from '../../components'
|
|
10
9
|
import {
|
|
11
10
|
composeOptions,
|
|
12
11
|
withMinimalBack,
|
|
13
12
|
} from '../../components/display/platform_modal_header_buttons'
|
|
14
13
|
import { useDebouncedSearchTerm } from '../../hooks/use_debounced_search_term'
|
|
14
|
+
import type { SearchResultResource } from '../../types/resources/search_result'
|
|
15
15
|
import { SearchPromptBlankState } from './components/search_blank_states'
|
|
16
16
|
import { SearchField } from './components/search_field'
|
|
17
17
|
import { SearchResultsList } from './components/search_results_list'
|
|
@@ -25,15 +25,33 @@ export const SearchScreenOptions = ({
|
|
|
25
25
|
)
|
|
26
26
|
|
|
27
27
|
export function SearchScreen() {
|
|
28
|
+
const navigation = useNavigation()
|
|
28
29
|
const [term, setTerm] = useState('')
|
|
29
30
|
const debouncedTerm = useDebouncedSearchTerm(term)
|
|
30
31
|
|
|
32
|
+
const openResult = (result: SearchResultResource) => {
|
|
33
|
+
Keyboard.dismiss()
|
|
34
|
+
|
|
35
|
+
if (result.type === 'conversation') {
|
|
36
|
+
navigation.navigate('Conversation', {
|
|
37
|
+
conversation_id: Number(result.id),
|
|
38
|
+
title: result.title,
|
|
39
|
+
})
|
|
40
|
+
} else {
|
|
41
|
+
navigation.navigate('Conversation', {
|
|
42
|
+
conversation_id: result.extra.conversationId,
|
|
43
|
+
initial_message_id: result.id,
|
|
44
|
+
title: result.title,
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
31
49
|
return (
|
|
32
50
|
<KeyboardView>
|
|
33
51
|
<View style={styles.container} testID="search-screen">
|
|
34
52
|
<SearchField term={term} onChange={setTerm} />
|
|
35
53
|
{debouncedTerm.length > 0 ? (
|
|
36
|
-
<SearchResultsList key={debouncedTerm} term={debouncedTerm} onSelect={
|
|
54
|
+
<SearchResultsList key={debouncedTerm} term={debouncedTerm} onSelect={openResult} />
|
|
37
55
|
) : (
|
|
38
56
|
<SearchPromptBlankState />
|
|
39
57
|
)}
|