react-native-gifted-chat 3.3.2 → 3.3.3
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/CHANGELOG.md +435 -0
- package/README.md +30 -2
- package/lib/Actions.d.ts +16 -0
- package/lib/Actions.d.ts.map +1 -0
- package/lib/Actions.js +65 -0
- package/lib/Actions.js.map +1 -0
- package/lib/Avatar.d.ts +19 -0
- package/lib/Avatar.d.ts.map +1 -0
- package/lib/Avatar.js +93 -0
- package/lib/Avatar.js.map +1 -0
- package/lib/Bubble/index.d.ts +6 -0
- package/lib/Bubble/index.d.ts.map +1 -0
- package/lib/Bubble/index.js +269 -0
- package/lib/Bubble/index.js.map +1 -0
- package/lib/Bubble/styles.d.ts +57 -0
- package/lib/Bubble/styles.d.ts.map +1 -0
- package/lib/Bubble/styles.js +59 -0
- package/lib/Bubble/styles.js.map +1 -0
- package/lib/Bubble/types.d.ts +59 -0
- package/lib/Bubble/types.d.ts.map +1 -0
- package/lib/Bubble/types.js +2 -0
- package/lib/Bubble/types.js.map +1 -0
- package/lib/Color.d.ts +18 -0
- package/lib/Color.d.ts.map +1 -0
- package/lib/Color.js +18 -0
- package/lib/Color.js.map +1 -0
- package/lib/Composer.d.ts +9 -0
- package/lib/Composer.d.ts.map +1 -0
- package/lib/Composer.js +56 -0
- package/lib/Composer.js.map +1 -0
- package/lib/Constant.d.ts +8 -0
- package/lib/Constant.d.ts.map +1 -0
- package/lib/Constant.js +8 -0
- package/lib/Constant.js.map +1 -0
- package/lib/Day/index.d.ts +5 -0
- package/lib/Day/index.d.ts.map +1 -0
- package/lib/Day/index.js +40 -0
- package/lib/Day/index.js.map +1 -0
- package/lib/Day/styles.d.ts +21 -0
- package/lib/Day/styles.d.ts.map +1 -0
- package/lib/Day/styles.js +22 -0
- package/lib/Day/styles.js.map +1 -0
- package/lib/Day/types.d.ts +11 -0
- package/lib/Day/types.d.ts.map +1 -0
- package/lib/Day/types.js +2 -0
- package/lib/Day/types.js.map +1 -0
- package/lib/GiftedAvatar.d.ts +12 -0
- package/lib/GiftedAvatar.d.ts.map +1 -0
- package/lib/GiftedAvatar.js +101 -0
- package/lib/GiftedAvatar.js.map +1 -0
- package/lib/GiftedChat/index.d.ts +10 -0
- package/lib/GiftedChat/index.d.ts.map +1 -0
- package/lib/GiftedChat/index.js +241 -0
- package/lib/GiftedChat/index.js.map +1 -0
- package/lib/GiftedChat/styles.d.ts +13 -0
- package/lib/GiftedChat/styles.d.ts.map +1 -0
- package/lib/GiftedChat/styles.js +13 -0
- package/lib/GiftedChat/styles.js.map +1 -0
- package/lib/GiftedChat/types.d.ts +90 -0
- package/lib/GiftedChat/types.d.ts.map +1 -0
- package/lib/GiftedChat/types.js +2 -0
- package/lib/GiftedChat/types.js.map +1 -0
- package/lib/GiftedChatContext.d.ts +11 -0
- package/lib/GiftedChatContext.d.ts.map +1 -0
- package/lib/GiftedChatContext.js +10 -0
- package/lib/GiftedChatContext.js.map +1 -0
- package/lib/InputToolbar.d.ts +36 -0
- package/lib/InputToolbar.d.ts.map +1 -0
- package/lib/InputToolbar.js +108 -0
- package/lib/InputToolbar.js.map +1 -0
- package/lib/LoadEarlierMessages.d.ts +17 -0
- package/lib/LoadEarlierMessages.d.ts.map +1 -0
- package/lib/LoadEarlierMessages.js +45 -0
- package/lib/LoadEarlierMessages.js.map +1 -0
- package/lib/Message/index.d.ts +6 -0
- package/lib/Message/index.d.ts.map +1 -0
- package/lib/Message/index.js +180 -0
- package/lib/Message/index.js.map +1 -0
- package/lib/Message/styles.d.ts +18 -0
- package/lib/Message/styles.d.ts.map +1 -0
- package/lib/Message/styles.js +18 -0
- package/lib/Message/styles.js.map +1 -0
- package/lib/Message/types.d.ts +25 -0
- package/lib/Message/types.d.ts.map +1 -0
- package/lib/Message/types.js +2 -0
- package/lib/Message/types.js.map +1 -0
- package/lib/MessageAudio.d.ts +3 -0
- package/lib/MessageAudio.d.ts.map +1 -0
- package/lib/MessageAudio.js +25 -0
- package/lib/MessageAudio.js.map +1 -0
- package/lib/MessageImage.d.ts +12 -0
- package/lib/MessageImage.d.ts.map +1 -0
- package/lib/MessageImage.js +164 -0
- package/lib/MessageImage.js.map +1 -0
- package/lib/MessageReply.d.ts +15 -0
- package/lib/MessageReply.d.ts.map +1 -0
- package/lib/MessageReply.js +103 -0
- package/lib/MessageReply.js.map +1 -0
- package/lib/MessageText.d.ts +24 -0
- package/lib/MessageText.d.ts.map +1 -0
- package/lib/MessageText.js +41 -0
- package/lib/MessageText.js.map +1 -0
- package/lib/MessageVideo.d.ts +3 -0
- package/lib/MessageVideo.d.ts.map +1 -0
- package/lib/MessageVideo.js +25 -0
- package/lib/MessageVideo.js.map +1 -0
- package/lib/MessagesContainer/components/DayAnimated/index.d.ts +5 -0
- package/lib/MessagesContainer/components/DayAnimated/index.d.ts.map +1 -0
- package/lib/MessagesContainer/components/DayAnimated/index.js +92 -0
- package/lib/MessagesContainer/components/DayAnimated/index.js.map +1 -0
- package/lib/MessagesContainer/components/DayAnimated/styles.d.ts +12 -0
- package/lib/MessagesContainer/components/DayAnimated/styles.d.ts.map +1 -0
- package/lib/MessagesContainer/components/DayAnimated/styles.js +12 -0
- package/lib/MessagesContainer/components/DayAnimated/styles.js.map +1 -0
- package/lib/MessagesContainer/components/DayAnimated/types.d.ts +18 -0
- package/lib/MessagesContainer/components/DayAnimated/types.d.ts.map +1 -0
- package/lib/MessagesContainer/components/DayAnimated/types.js +2 -0
- package/lib/MessagesContainer/components/DayAnimated/types.js.map +1 -0
- package/lib/MessagesContainer/components/Item/index.d.ts +23 -0
- package/lib/MessagesContainer/components/Item/index.d.ts.map +1 -0
- package/lib/MessagesContainer/components/Item/index.js +120 -0
- package/lib/MessagesContainer/components/Item/index.js.map +1 -0
- package/lib/MessagesContainer/components/Item/types.d.ts +19 -0
- package/lib/MessagesContainer/components/Item/types.d.ts.map +1 -0
- package/lib/MessagesContainer/components/Item/types.js +2 -0
- package/lib/MessagesContainer/components/Item/types.js.map +1 -0
- package/lib/MessagesContainer/index.d.ts +6 -0
- package/lib/MessagesContainer/index.d.ts.map +1 -0
- package/lib/MessagesContainer/index.js +258 -0
- package/lib/MessagesContainer/index.js.map +1 -0
- package/lib/MessagesContainer/styles.d.ts +55 -0
- package/lib/MessagesContainer/styles.d.ts.map +1 -0
- package/lib/MessagesContainer/styles.js +42 -0
- package/lib/MessagesContainer/styles.js.map +1 -0
- package/lib/MessagesContainer/types.d.ts +88 -0
- package/lib/MessagesContainer/types.d.ts.map +1 -0
- package/lib/MessagesContainer/types.js +10 -0
- package/lib/MessagesContainer/types.js.map +1 -0
- package/lib/Models.d.ts +58 -0
- package/lib/Models.d.ts.map +1 -0
- package/lib/Models.js +2 -0
- package/lib/Models.js.map +1 -0
- package/lib/QuickReplies.d.ts +16 -0
- package/lib/QuickReplies.d.ts.map +1 -0
- package/lib/QuickReplies.js +108 -0
- package/lib/QuickReplies.js.map +1 -0
- package/lib/Reply/index.d.ts +2 -0
- package/lib/Reply/index.d.ts.map +1 -0
- package/lib/Reply/index.js +2 -0
- package/lib/Reply/index.js.map +1 -0
- package/lib/Reply/types.d.ts +72 -0
- package/lib/Reply/types.d.ts.map +1 -0
- package/lib/Reply/types.js +2 -0
- package/lib/Reply/types.js.map +1 -0
- package/lib/ReplyPreview.d.ts +14 -0
- package/lib/ReplyPreview.d.ts.map +1 -0
- package/lib/ReplyPreview.js +95 -0
- package/lib/ReplyPreview.js.map +1 -0
- package/lib/Send.d.ts +19 -0
- package/lib/Send.d.ts.map +1 -0
- package/lib/Send.js +57 -0
- package/lib/Send.js.map +1 -0
- package/lib/SystemMessage.d.ts +14 -0
- package/lib/SystemMessage.d.ts.map +1 -0
- package/lib/SystemMessage.js +42 -0
- package/lib/SystemMessage.js.map +1 -0
- package/lib/Time.d.ts +12 -0
- package/lib/Time.d.ts.map +1 -0
- package/lib/Time.js +39 -0
- package/lib/Time.js.map +1 -0
- package/lib/TypingIndicator/index.d.ts +5 -0
- package/lib/TypingIndicator/index.d.ts.map +1 -0
- package/lib/TypingIndicator/index.js +94 -0
- package/lib/TypingIndicator/index.js.map +1 -0
- package/lib/TypingIndicator/styles.d.ts +21 -0
- package/lib/TypingIndicator/styles.d.ts.map +1 -0
- package/lib/TypingIndicator/styles.js +22 -0
- package/lib/TypingIndicator/styles.js.map +1 -0
- package/lib/TypingIndicator/types.d.ts +6 -0
- package/lib/TypingIndicator/types.d.ts.map +1 -0
- package/lib/TypingIndicator/types.js +2 -0
- package/lib/TypingIndicator/types.js.map +1 -0
- package/lib/components/MessageReply.d.ts +29 -0
- package/lib/components/MessageReply.d.ts.map +1 -0
- package/lib/components/MessageReply.js +87 -0
- package/lib/components/MessageReply.js.map +1 -0
- package/lib/components/ReplyPreview.d.ts +17 -0
- package/lib/components/ReplyPreview.d.ts.map +1 -0
- package/lib/components/ReplyPreview.js +148 -0
- package/lib/components/ReplyPreview.js.map +1 -0
- package/lib/components/TouchableOpacity.d.ts +9 -0
- package/lib/components/TouchableOpacity.d.ts.map +1 -0
- package/lib/components/TouchableOpacity.js +37 -0
- package/lib/components/TouchableOpacity.js.map +1 -0
- package/lib/hooks/useColorScheme.d.ts +8 -0
- package/lib/hooks/useColorScheme.d.ts.map +1 -0
- package/lib/hooks/useColorScheme.js +17 -0
- package/lib/hooks/useColorScheme.js.map +1 -0
- package/lib/hooks/useUpdateLayoutEffect.d.ts +9 -0
- package/lib/hooks/useUpdateLayoutEffect.d.ts.map +1 -0
- package/lib/hooks/useUpdateLayoutEffect.js +17 -0
- package/lib/hooks/useUpdateLayoutEffect.js.map +1 -0
- package/lib/index.d.ts +31 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +31 -0
- package/lib/index.js.map +1 -0
- package/lib/linkParser.d.ts +39 -0
- package/lib/linkParser.d.ts.map +1 -0
- package/lib/linkParser.js +154 -0
- package/lib/linkParser.js.map +1 -0
- package/lib/logging.d.ts +3 -0
- package/lib/logging.d.ts.map +1 -0
- package/lib/logging.js +5 -0
- package/lib/logging.js.map +1 -0
- package/lib/styles.d.ts +14 -0
- package/lib/styles.d.ts.map +1 -0
- package/lib/styles.js +23 -0
- package/lib/styles.js.map +1 -0
- package/lib/types.d.ts +19 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/utils.d.ts +8 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +105 -0
- package/lib/utils.js.map +1 -0
- package/package.json +8 -7
- package/src/Actions.tsx +0 -110
- package/src/Avatar.tsx +0 -169
- package/src/Bubble/index.tsx +0 -407
- package/src/Bubble/styles.ts +0 -66
- package/src/Bubble/types.ts +0 -104
- package/src/Color.ts +0 -17
- package/src/Composer.tsx +0 -100
- package/src/Constant.ts +0 -8
- package/src/Day/index.tsx +0 -63
- package/src/Day/styles.ts +0 -22
- package/src/Day/types.ts +0 -15
- package/src/GiftedAvatar.tsx +0 -187
- package/src/GiftedChat/index.tsx +0 -397
- package/src/GiftedChat/styles.ts +0 -13
- package/src/GiftedChat/types.ts +0 -156
- package/src/GiftedChatContext.ts +0 -25
- package/src/InputToolbar.tsx +0 -177
- package/src/LoadEarlierMessages.tsx +0 -94
- package/src/Message/index.tsx +0 -273
- package/src/Message/styles.ts +0 -18
- package/src/Message/types.ts +0 -26
- package/src/MessageAudio.tsx +0 -29
- package/src/MessageImage.tsx +0 -251
- package/src/MessageReply.tsx +0 -160
- package/src/MessageText.tsx +0 -111
- package/src/MessageVideo.tsx +0 -29
- package/src/MessagesContainer/components/DayAnimated/index.tsx +0 -151
- package/src/MessagesContainer/components/DayAnimated/styles.ts +0 -12
- package/src/MessagesContainer/components/DayAnimated/types.ts +0 -12
- package/src/MessagesContainer/components/Item/index.tsx +0 -197
- package/src/MessagesContainer/components/Item/types.ts +0 -13
- package/src/MessagesContainer/index.tsx +0 -434
- package/src/MessagesContainer/styles.ts +0 -42
- package/src/MessagesContainer/types.ts +0 -102
- package/src/Models.ts +0 -66
- package/src/QuickReplies.tsx +0 -181
- package/src/Reply/index.ts +0 -1
- package/src/Reply/types.ts +0 -80
- package/src/ReplyPreview.tsx +0 -132
- package/src/Send.tsx +0 -115
- package/src/SystemMessage.tsx +0 -79
- package/src/Time.tsx +0 -64
- package/src/TypingIndicator/index.tsx +0 -155
- package/src/TypingIndicator/styles.ts +0 -22
- package/src/TypingIndicator/types.ts +0 -6
- package/src/__tests__/Actions.test.tsx +0 -9
- package/src/__tests__/Avatar.test.tsx +0 -17
- package/src/__tests__/Bubble.test.tsx +0 -17
- package/src/__tests__/Color.test.tsx +0 -5
- package/src/__tests__/Composer.test.tsx +0 -10
- package/src/__tests__/Constant.test.tsx +0 -5
- package/src/__tests__/Day.test.tsx +0 -20
- package/src/__tests__/DayAnimated.test.tsx +0 -46
- package/src/__tests__/GiftedAvatar.test.tsx +0 -10
- package/src/__tests__/GiftedChat.test.tsx +0 -60
- package/src/__tests__/InputToolbar.test.tsx +0 -10
- package/src/__tests__/LoadEarlier.test.tsx +0 -10
- package/src/__tests__/Message.test.tsx +0 -67
- package/src/__tests__/MessageImage.test.tsx +0 -24
- package/src/__tests__/MessageReply.test.tsx +0 -54
- package/src/__tests__/MessageText.test.tsx +0 -15
- package/src/__tests__/MessagesContainer.test.tsx +0 -38
- package/src/__tests__/ReplyPreview.test.tsx +0 -41
- package/src/__tests__/Send.test.tsx +0 -21
- package/src/__tests__/SystemMessage.test.tsx +0 -24
- package/src/__tests__/Time.test.tsx +0 -26
- package/src/__tests__/__snapshots__/Actions.test.tsx.snap +0 -40
- package/src/__tests__/__snapshots__/Avatar.test.tsx.snap +0 -17
- package/src/__tests__/__snapshots__/Bubble.test.tsx.snap +0 -121
- package/src/__tests__/__snapshots__/Color.test.tsx.snap +0 -21
- package/src/__tests__/__snapshots__/Composer.test.tsx.snap +0 -51
- package/src/__tests__/__snapshots__/Constant.test.tsx.snap +0 -13
- package/src/__tests__/__snapshots__/Day.test.tsx.snap +0 -99
- package/src/__tests__/__snapshots__/DayAnimated.test.tsx.snap +0 -5
- package/src/__tests__/__snapshots__/GiftedAvatar.test.tsx.snap +0 -24
- package/src/__tests__/__snapshots__/GiftedChat.test.tsx.snap +0 -184
- package/src/__tests__/__snapshots__/InputToolbar.test.tsx.snap +0 -123
- package/src/__tests__/__snapshots__/LoadEarlier.test.tsx.snap +0 -33
- package/src/__tests__/__snapshots__/Message.test.tsx.snap +0 -510
- package/src/__tests__/__snapshots__/MessageImage.test.tsx.snap +0 -203
- package/src/__tests__/__snapshots__/MessageReply.test.tsx.snap +0 -181
- package/src/__tests__/__snapshots__/MessageText.test.tsx.snap +0 -29
- package/src/__tests__/__snapshots__/ReplyPreview.test.tsx.snap +0 -349
- package/src/__tests__/__snapshots__/Send.test.tsx.snap +0 -148
- package/src/__tests__/__snapshots__/SystemMessage.test.tsx.snap +0 -77
- package/src/__tests__/__snapshots__/Time.test.tsx.snap +0 -22
- package/src/__tests__/data.ts +0 -8
- package/src/__tests__/utils.test.ts +0 -31
- package/src/components/MessageReply.tsx +0 -156
- package/src/components/ReplyPreview.tsx +0 -230
- package/src/components/TouchableOpacity.tsx +0 -67
- package/src/hooks/useColorScheme.ts +0 -18
- package/src/hooks/useUpdateLayoutEffect.ts +0 -21
- package/src/index.ts +0 -29
- package/src/linkParser.tsx +0 -255
- package/src/logging.ts +0 -8
- package/src/styles.ts +0 -25
- package/src/types.ts +0 -25
- package/src/utils.ts +0 -139
package/src/MessageReply.tsx
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import React, { useMemo, useCallback } from 'react'
|
|
2
|
-
import {
|
|
3
|
-
StyleSheet,
|
|
4
|
-
ViewStyle,
|
|
5
|
-
View,
|
|
6
|
-
Pressable,
|
|
7
|
-
Image,
|
|
8
|
-
TextStyle,
|
|
9
|
-
StyleProp,
|
|
10
|
-
ImageStyle,
|
|
11
|
-
} from 'react-native'
|
|
12
|
-
|
|
13
|
-
import { Text } from 'react-native-gesture-handler'
|
|
14
|
-
import { Color } from './Color'
|
|
15
|
-
import { LeftRightStyle, IMessage, ReplyMessage } from './Models'
|
|
16
|
-
import { getStyleWithPosition } from './styles'
|
|
17
|
-
|
|
18
|
-
export interface MessageReplyProps<TMessage extends IMessage> {
|
|
19
|
-
position?: 'left' | 'right'
|
|
20
|
-
currentMessage: TMessage
|
|
21
|
-
containerStyle?: LeftRightStyle<ViewStyle>
|
|
22
|
-
contentContainerStyle?: LeftRightStyle<ViewStyle>
|
|
23
|
-
imageStyle?: StyleProp<ImageStyle>
|
|
24
|
-
usernameStyle?: StyleProp<TextStyle>
|
|
25
|
-
textStyle?: StyleProp<TextStyle>
|
|
26
|
-
onPress?: (replyMessage: ReplyMessage) => void
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function MessageReply<TMessage extends IMessage = IMessage> ({
|
|
30
|
-
currentMessage,
|
|
31
|
-
position = 'left',
|
|
32
|
-
containerStyle,
|
|
33
|
-
contentContainerStyle,
|
|
34
|
-
imageStyle,
|
|
35
|
-
usernameStyle,
|
|
36
|
-
textStyle,
|
|
37
|
-
onPress: onPressProp,
|
|
38
|
-
}: MessageReplyProps<TMessage>) {
|
|
39
|
-
const handlePress = useCallback(() => {
|
|
40
|
-
if (!onPressProp || !currentMessage.replyMessage)
|
|
41
|
-
return
|
|
42
|
-
|
|
43
|
-
onPressProp(currentMessage.replyMessage)
|
|
44
|
-
}, [onPressProp, currentMessage.replyMessage])
|
|
45
|
-
|
|
46
|
-
const containerStyleMemo = useMemo(() => [
|
|
47
|
-
styles.container,
|
|
48
|
-
getStyleWithPosition(styles, 'container', position),
|
|
49
|
-
containerStyle?.[position],
|
|
50
|
-
], [position, containerStyle])
|
|
51
|
-
|
|
52
|
-
const contentContainerStyleMemo = useMemo(() => [
|
|
53
|
-
styles.contentContainer,
|
|
54
|
-
contentContainerStyle?.[position],
|
|
55
|
-
], [position, contentContainerStyle])
|
|
56
|
-
|
|
57
|
-
const imageStyleMemo = useMemo(() => [
|
|
58
|
-
styles.image,
|
|
59
|
-
imageStyle,
|
|
60
|
-
], [imageStyle])
|
|
61
|
-
|
|
62
|
-
const usernameStyleMemo = useMemo(() => [
|
|
63
|
-
styles.username,
|
|
64
|
-
getStyleWithPosition(styles, 'username', position),
|
|
65
|
-
usernameStyle,
|
|
66
|
-
], [position, usernameStyle])
|
|
67
|
-
|
|
68
|
-
const textStyleMemo = useMemo(() => [
|
|
69
|
-
styles.text,
|
|
70
|
-
getStyleWithPosition(styles, 'text', position),
|
|
71
|
-
textStyle,
|
|
72
|
-
], [position, textStyle])
|
|
73
|
-
|
|
74
|
-
if (!currentMessage.replyMessage)
|
|
75
|
-
return null
|
|
76
|
-
|
|
77
|
-
const { replyMessage } = currentMessage
|
|
78
|
-
|
|
79
|
-
return (
|
|
80
|
-
<Pressable
|
|
81
|
-
onPress={handlePress}
|
|
82
|
-
style={containerStyleMemo}
|
|
83
|
-
>
|
|
84
|
-
<View style={contentContainerStyleMemo}>
|
|
85
|
-
{replyMessage.image && (
|
|
86
|
-
<Image
|
|
87
|
-
source={{ uri: replyMessage.image }}
|
|
88
|
-
style={imageStyleMemo}
|
|
89
|
-
/>
|
|
90
|
-
)}
|
|
91
|
-
<View style={styles.textContainer}>
|
|
92
|
-
<Text
|
|
93
|
-
style={usernameStyleMemo}
|
|
94
|
-
numberOfLines={1}
|
|
95
|
-
>
|
|
96
|
-
{replyMessage.user?.name || 'User'}
|
|
97
|
-
</Text>
|
|
98
|
-
<Text
|
|
99
|
-
numberOfLines={1}
|
|
100
|
-
style={textStyleMemo}
|
|
101
|
-
>
|
|
102
|
-
{replyMessage.text || (replyMessage.image ? 'Photo' : (replyMessage.audio ? 'Audio' : 'Message'))}
|
|
103
|
-
</Text>
|
|
104
|
-
</View>
|
|
105
|
-
</View>
|
|
106
|
-
</Pressable>
|
|
107
|
-
)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const styles = StyleSheet.create({
|
|
111
|
-
container: {
|
|
112
|
-
marginHorizontal: 10,
|
|
113
|
-
marginTop: 5,
|
|
114
|
-
marginBottom: 2,
|
|
115
|
-
padding: 8,
|
|
116
|
-
borderRadius: 8,
|
|
117
|
-
borderLeftWidth: 3,
|
|
118
|
-
borderLeftColor: Color.defaultBlue,
|
|
119
|
-
minWidth: 150,
|
|
120
|
-
},
|
|
121
|
-
container_left: {
|
|
122
|
-
backgroundColor: 'rgba(0, 0, 0, 0.05)',
|
|
123
|
-
},
|
|
124
|
-
container_right: {
|
|
125
|
-
backgroundColor: 'rgba(255, 255, 255, 0.15)',
|
|
126
|
-
},
|
|
127
|
-
contentContainer: {
|
|
128
|
-
flexDirection: 'row',
|
|
129
|
-
alignItems: 'center',
|
|
130
|
-
},
|
|
131
|
-
image: {
|
|
132
|
-
width: 36,
|
|
133
|
-
height: 36,
|
|
134
|
-
borderRadius: 4,
|
|
135
|
-
marginRight: 8,
|
|
136
|
-
},
|
|
137
|
-
textContainer: {
|
|
138
|
-
flex: 1,
|
|
139
|
-
},
|
|
140
|
-
username: {
|
|
141
|
-
fontSize: 13,
|
|
142
|
-
fontWeight: '600',
|
|
143
|
-
marginBottom: 2,
|
|
144
|
-
},
|
|
145
|
-
username_left: {
|
|
146
|
-
color: Color.defaultBlue,
|
|
147
|
-
},
|
|
148
|
-
username_right: {
|
|
149
|
-
color: Color.white,
|
|
150
|
-
},
|
|
151
|
-
text: {
|
|
152
|
-
fontSize: 13,
|
|
153
|
-
},
|
|
154
|
-
text_left: {
|
|
155
|
-
color: Color.black,
|
|
156
|
-
},
|
|
157
|
-
text_right: {
|
|
158
|
-
color: 'rgba(255, 255, 255, 0.8)',
|
|
159
|
-
},
|
|
160
|
-
})
|
package/src/MessageText.tsx
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import React, { useMemo, useCallback } from 'react'
|
|
2
|
-
import {
|
|
3
|
-
StyleSheet,
|
|
4
|
-
StyleProp,
|
|
5
|
-
ViewStyle,
|
|
6
|
-
TextStyle,
|
|
7
|
-
View,
|
|
8
|
-
} from 'react-native'
|
|
9
|
-
|
|
10
|
-
import { Text } from 'react-native-gesture-handler'
|
|
11
|
-
import { LinkParser, LinkMatcher, LinkType } from './linkParser'
|
|
12
|
-
import { LeftRightStyle, IMessage } from './Models'
|
|
13
|
-
|
|
14
|
-
export type MessageTextProps<TMessage extends IMessage> = {
|
|
15
|
-
position?: 'left' | 'right'
|
|
16
|
-
currentMessage: TMessage
|
|
17
|
-
containerStyle?: LeftRightStyle<ViewStyle>
|
|
18
|
-
textStyle?: LeftRightStyle<TextStyle>
|
|
19
|
-
linkStyle?: LeftRightStyle<TextStyle>
|
|
20
|
-
customTextStyle?: StyleProp<TextStyle>
|
|
21
|
-
onPress?: (
|
|
22
|
-
message: TMessage,
|
|
23
|
-
url: string,
|
|
24
|
-
type: LinkType
|
|
25
|
-
) => void
|
|
26
|
-
// Link parser options
|
|
27
|
-
matchers?: LinkMatcher[]
|
|
28
|
-
email?: boolean
|
|
29
|
-
phone?: boolean
|
|
30
|
-
url?: boolean
|
|
31
|
-
hashtag?: boolean
|
|
32
|
-
mention?: boolean
|
|
33
|
-
hashtagUrl?: string
|
|
34
|
-
mentionUrl?: string
|
|
35
|
-
stripPrefix?: boolean
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function MessageText<TMessage extends IMessage>({
|
|
39
|
-
currentMessage,
|
|
40
|
-
position = 'left',
|
|
41
|
-
containerStyle,
|
|
42
|
-
textStyle,
|
|
43
|
-
linkStyle: linkStyleProp,
|
|
44
|
-
customTextStyle,
|
|
45
|
-
onPress: onPressProp,
|
|
46
|
-
matchers,
|
|
47
|
-
email = true,
|
|
48
|
-
phone = true,
|
|
49
|
-
url = true,
|
|
50
|
-
hashtag = false,
|
|
51
|
-
mention = false,
|
|
52
|
-
hashtagUrl,
|
|
53
|
-
mentionUrl,
|
|
54
|
-
stripPrefix = false,
|
|
55
|
-
}: MessageTextProps<TMessage>) {
|
|
56
|
-
const linkStyle = useMemo(() => StyleSheet.flatten([
|
|
57
|
-
styles.link,
|
|
58
|
-
linkStyleProp?.[position],
|
|
59
|
-
]), [position, linkStyleProp])
|
|
60
|
-
|
|
61
|
-
const style = useMemo(() => [
|
|
62
|
-
styles[`text_${position}`],
|
|
63
|
-
textStyle?.[position],
|
|
64
|
-
customTextStyle,
|
|
65
|
-
], [position, textStyle, customTextStyle])
|
|
66
|
-
|
|
67
|
-
const handlePress = useCallback((url: string, type: LinkType) => {
|
|
68
|
-
onPressProp?.(currentMessage, url, type)
|
|
69
|
-
}, [onPressProp, currentMessage])
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<View style={[styles.container, containerStyle?.[position]]}>
|
|
73
|
-
<LinkParser
|
|
74
|
-
text={currentMessage!.text}
|
|
75
|
-
matchers={matchers}
|
|
76
|
-
email={email}
|
|
77
|
-
phone={phone}
|
|
78
|
-
url={url}
|
|
79
|
-
hashtag={hashtag}
|
|
80
|
-
mention={mention}
|
|
81
|
-
hashtagUrl={hashtagUrl}
|
|
82
|
-
mentionUrl={mentionUrl}
|
|
83
|
-
stripPrefix={stripPrefix}
|
|
84
|
-
linkStyle={linkStyle}
|
|
85
|
-
textStyle={style}
|
|
86
|
-
onPress={onPressProp ? handlePress : undefined}
|
|
87
|
-
TextComponent={Text}
|
|
88
|
-
/>
|
|
89
|
-
</View>
|
|
90
|
-
)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const styles = StyleSheet.create({
|
|
94
|
-
container: {
|
|
95
|
-
marginVertical: 5,
|
|
96
|
-
marginHorizontal: 10,
|
|
97
|
-
},
|
|
98
|
-
text: {
|
|
99
|
-
fontSize: 16,
|
|
100
|
-
lineHeight: 20,
|
|
101
|
-
},
|
|
102
|
-
text_left: {
|
|
103
|
-
color: 'black',
|
|
104
|
-
},
|
|
105
|
-
text_right: {
|
|
106
|
-
color: 'white',
|
|
107
|
-
},
|
|
108
|
-
link: {
|
|
109
|
-
textDecorationLine: 'underline',
|
|
110
|
-
},
|
|
111
|
-
})
|
package/src/MessageVideo.tsx
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React, { useMemo } from 'react'
|
|
2
|
-
import { View, StyleSheet } from 'react-native'
|
|
3
|
-
import { Text } from 'react-native-gesture-handler'
|
|
4
|
-
import { Color } from './Color'
|
|
5
|
-
|
|
6
|
-
const styles = StyleSheet.create({
|
|
7
|
-
container: {
|
|
8
|
-
padding: 10,
|
|
9
|
-
},
|
|
10
|
-
text: {
|
|
11
|
-
color: Color.alizarin,
|
|
12
|
-
fontWeight: '600',
|
|
13
|
-
},
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
export function MessageVideo () {
|
|
17
|
-
const content = useMemo(() => (
|
|
18
|
-
<View style={styles.container}>
|
|
19
|
-
<Text style={styles.text}>
|
|
20
|
-
{'Video is not implemented by GiftedChat.'}
|
|
21
|
-
</Text>
|
|
22
|
-
<Text style={styles.text}>
|
|
23
|
-
{'\nYou need to provide your own implementation by using renderMessageVideo prop.'}
|
|
24
|
-
</Text>
|
|
25
|
-
</View>
|
|
26
|
-
), [])
|
|
27
|
-
|
|
28
|
-
return content
|
|
29
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useEffect, useMemo, useState } from 'react'
|
|
2
|
-
import { LayoutChangeEvent } from 'react-native'
|
|
3
|
-
import Animated, { interpolate, useAnimatedStyle, useDerivedValue, useSharedValue, useAnimatedReaction, withTiming, runOnJS } from 'react-native-reanimated'
|
|
4
|
-
import { Day } from '../../../Day'
|
|
5
|
-
import stylesCommon from '../../../styles'
|
|
6
|
-
import { isSameDay } from '../../../utils'
|
|
7
|
-
import { useAbsoluteScrolledPositionToBottomOfDay, useRelativeScrolledPositionToBottomOfDay } from '../Item'
|
|
8
|
-
|
|
9
|
-
import styles from './styles'
|
|
10
|
-
import { DayAnimatedProps } from './types'
|
|
11
|
-
|
|
12
|
-
export * from './types'
|
|
13
|
-
|
|
14
|
-
export const DayAnimated = ({ scrolledY, daysPositions, listHeight, renderDay, messages, isLoading, ...rest }: DayAnimatedProps) => {
|
|
15
|
-
const opacity = useSharedValue(0)
|
|
16
|
-
const fadeOutOpacityTimeoutId = useSharedValue<ReturnType<typeof setTimeout> | undefined>(undefined)
|
|
17
|
-
const containerHeight = useSharedValue(0)
|
|
18
|
-
|
|
19
|
-
const isScrolledOnMount = useSharedValue(false)
|
|
20
|
-
const isLoadingAnim = useSharedValue(isLoading)
|
|
21
|
-
|
|
22
|
-
const daysPositionsArray = useDerivedValue(() => Object.values(daysPositions.value).sort((a, b) => {
|
|
23
|
-
'worklet'
|
|
24
|
-
|
|
25
|
-
return a.y - b.y
|
|
26
|
-
}))
|
|
27
|
-
|
|
28
|
-
const [createdAt, setCreatedAt] = useState<number | undefined>()
|
|
29
|
-
|
|
30
|
-
const dayTopOffset = useMemo(() => 10, [])
|
|
31
|
-
const dayBottomMargin = useMemo(() => 10, [])
|
|
32
|
-
const absoluteScrolledPositionToBottomOfDay = useAbsoluteScrolledPositionToBottomOfDay(listHeight, scrolledY, containerHeight, dayBottomMargin, dayTopOffset)
|
|
33
|
-
const relativeScrolledPositionToBottomOfDay = useRelativeScrolledPositionToBottomOfDay(listHeight, scrolledY, daysPositions, containerHeight, dayBottomMargin, dayTopOffset)
|
|
34
|
-
|
|
35
|
-
const messagesDates = useMemo(() => {
|
|
36
|
-
const messagesDates: number[] = []
|
|
37
|
-
|
|
38
|
-
for (let i = 1; i < messages.length; i++) {
|
|
39
|
-
const previousMessage = messages[i - 1]
|
|
40
|
-
const message = messages[i]
|
|
41
|
-
|
|
42
|
-
if (!isSameDay(previousMessage, message) || !messagesDates.includes(new Date(message.createdAt).getTime()))
|
|
43
|
-
messagesDates.push(new Date(message.createdAt).getTime())
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return messagesDates
|
|
47
|
-
}, [messages])
|
|
48
|
-
|
|
49
|
-
const createdAtDate = useDerivedValue(() => {
|
|
50
|
-
for (let i = 0; i < daysPositionsArray.value.length; i++) {
|
|
51
|
-
const day = daysPositionsArray.value[i]
|
|
52
|
-
const dayPosition = day.y + day.height - containerHeight.value - dayBottomMargin
|
|
53
|
-
|
|
54
|
-
if (absoluteScrolledPositionToBottomOfDay.value < dayPosition)
|
|
55
|
-
return day.createdAt
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return messagesDates[messagesDates.length - 1]
|
|
59
|
-
}, [daysPositionsArray, absoluteScrolledPositionToBottomOfDay, messagesDates, containerHeight, dayBottomMargin])
|
|
60
|
-
|
|
61
|
-
const style = useAnimatedStyle(() => ({
|
|
62
|
-
top: interpolate(
|
|
63
|
-
relativeScrolledPositionToBottomOfDay.value,
|
|
64
|
-
[-dayTopOffset, -0.0001, 0, isLoadingAnim.value ? 0 : containerHeight.value + dayTopOffset],
|
|
65
|
-
[dayTopOffset, dayTopOffset, -containerHeight.value, isLoadingAnim.value ? -containerHeight.value : dayTopOffset],
|
|
66
|
-
'clamp'
|
|
67
|
-
),
|
|
68
|
-
}), [relativeScrolledPositionToBottomOfDay, containerHeight, dayTopOffset, isLoadingAnim])
|
|
69
|
-
|
|
70
|
-
const contentStyle = useAnimatedStyle(() => ({
|
|
71
|
-
opacity: opacity.value,
|
|
72
|
-
}), [opacity])
|
|
73
|
-
|
|
74
|
-
const fadeOut = useCallback(() => {
|
|
75
|
-
'worklet'
|
|
76
|
-
|
|
77
|
-
opacity.value = withTiming(0, { duration: 500 })
|
|
78
|
-
}, [opacity])
|
|
79
|
-
|
|
80
|
-
const scheduleFadeOut = useCallback(() => {
|
|
81
|
-
clearTimeout(fadeOutOpacityTimeoutId.value)
|
|
82
|
-
|
|
83
|
-
fadeOutOpacityTimeoutId.value = setTimeout(fadeOut, 500)
|
|
84
|
-
}, [fadeOut, fadeOutOpacityTimeoutId])
|
|
85
|
-
|
|
86
|
-
const handleLayout = useCallback(({ nativeEvent }: LayoutChangeEvent) => {
|
|
87
|
-
containerHeight.value = nativeEvent.layout.height
|
|
88
|
-
}, [containerHeight])
|
|
89
|
-
|
|
90
|
-
useAnimatedReaction(
|
|
91
|
-
() => [scrolledY.value, daysPositionsArray],
|
|
92
|
-
(value, prevValue) => {
|
|
93
|
-
if (!isScrolledOnMount.value) {
|
|
94
|
-
isScrolledOnMount.value = true
|
|
95
|
-
return
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (value[0] === prevValue?.[0])
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
opacity.value = withTiming(1, { duration: 500 })
|
|
102
|
-
|
|
103
|
-
runOnJS(scheduleFadeOut)()
|
|
104
|
-
},
|
|
105
|
-
[scrolledY, scheduleFadeOut, daysPositionsArray]
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
useAnimatedReaction(
|
|
109
|
-
() => createdAtDate.value,
|
|
110
|
-
(value, prevValue) => {
|
|
111
|
-
if (value && value !== prevValue)
|
|
112
|
-
runOnJS(setCreatedAt)(value)
|
|
113
|
-
},
|
|
114
|
-
[createdAtDate]
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
useEffect(() => {
|
|
118
|
-
isLoadingAnim.value = isLoading
|
|
119
|
-
}, [isLoadingAnim, isLoading])
|
|
120
|
-
|
|
121
|
-
const dayContent = useMemo(() => {
|
|
122
|
-
if (!createdAt)
|
|
123
|
-
return null
|
|
124
|
-
|
|
125
|
-
return renderDay
|
|
126
|
-
? renderDay({ ...rest, createdAt })
|
|
127
|
-
: <Day
|
|
128
|
-
{...rest}
|
|
129
|
-
containerStyle={[styles.dayAnimatedDayContainerStyle, rest.containerStyle]}
|
|
130
|
-
createdAt={createdAt}
|
|
131
|
-
/>
|
|
132
|
-
}, [createdAt, renderDay, rest])
|
|
133
|
-
|
|
134
|
-
if (!createdAt)
|
|
135
|
-
return null
|
|
136
|
-
|
|
137
|
-
return (
|
|
138
|
-
<Animated.View
|
|
139
|
-
style={[stylesCommon.centerItems, styles.dayAnimated, style]}
|
|
140
|
-
onLayout={handleLayout}
|
|
141
|
-
pointerEvents='none'
|
|
142
|
-
>
|
|
143
|
-
<Animated.View
|
|
144
|
-
style={contentStyle}
|
|
145
|
-
pointerEvents='none'
|
|
146
|
-
>
|
|
147
|
-
{dayContent}
|
|
148
|
-
</Animated.View>
|
|
149
|
-
</Animated.View>
|
|
150
|
-
)
|
|
151
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { DayProps } from '../../../Day'
|
|
2
|
-
import { IMessage } from '../../../Models'
|
|
3
|
-
import { DaysPositions } from '../../types'
|
|
4
|
-
|
|
5
|
-
export interface DayAnimatedProps extends Omit<DayProps, 'createdAt'> {
|
|
6
|
-
scrolledY: { value: number }
|
|
7
|
-
daysPositions: { value: DaysPositions }
|
|
8
|
-
listHeight: { value: number }
|
|
9
|
-
renderDay?: (props: DayProps) => React.ReactNode
|
|
10
|
-
messages: IMessage[]
|
|
11
|
-
isLoading: boolean
|
|
12
|
-
}
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useMemo } from 'react'
|
|
2
|
-
import { LayoutChangeEvent, View } from 'react-native'
|
|
3
|
-
import Animated, { interpolate, useAnimatedStyle, useDerivedValue, useSharedValue } from 'react-native-reanimated'
|
|
4
|
-
import { Day } from '../../../Day'
|
|
5
|
-
import { Message, MessageProps } from '../../../Message'
|
|
6
|
-
import { IMessage } from '../../../Models'
|
|
7
|
-
import { isSameDay } from '../../../utils'
|
|
8
|
-
import { DaysPositions } from '../../types'
|
|
9
|
-
import { ItemProps } from './types'
|
|
10
|
-
|
|
11
|
-
export * from './types'
|
|
12
|
-
|
|
13
|
-
// y-position of current scroll position relative to the bottom of the day container. (since we have inverted list it is bottom)
|
|
14
|
-
export const useAbsoluteScrolledPositionToBottomOfDay = (listHeight: { value: number }, scrolledY: { value: number }, containerHeight: { value: number }, dayBottomMargin: number, dayTopOffset: number) => {
|
|
15
|
-
const absoluteScrolledPositionToBottomOfDay = useDerivedValue(() =>
|
|
16
|
-
listHeight.value + scrolledY.value - containerHeight.value - dayBottomMargin - dayTopOffset
|
|
17
|
-
, [listHeight, scrolledY, containerHeight, dayBottomMargin, dayTopOffset])
|
|
18
|
-
|
|
19
|
-
return absoluteScrolledPositionToBottomOfDay
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const useRelativeScrolledPositionToBottomOfDay = (
|
|
23
|
-
listHeight: { value: number },
|
|
24
|
-
scrolledY: { value: number },
|
|
25
|
-
daysPositions: { value: DaysPositions },
|
|
26
|
-
containerHeight: { value: number },
|
|
27
|
-
dayBottomMargin: number,
|
|
28
|
-
dayTopOffset: number,
|
|
29
|
-
createdAt?: number
|
|
30
|
-
) => {
|
|
31
|
-
const dayMarginTop = useMemo(() => 5, [])
|
|
32
|
-
|
|
33
|
-
const absoluteScrolledPositionToBottomOfDay = useAbsoluteScrolledPositionToBottomOfDay(listHeight, scrolledY, containerHeight, dayBottomMargin, dayTopOffset)
|
|
34
|
-
|
|
35
|
-
// find current day position by scrolled position
|
|
36
|
-
const currentDayPosition = useDerivedValue(() => {
|
|
37
|
-
'worklet'
|
|
38
|
-
|
|
39
|
-
// When createdAt is provided (called from AnimatedDayWrapper for a specific message),
|
|
40
|
-
// directly find the day position by createdAt without sorting the entire array.
|
|
41
|
-
// This avoids O(n log n) sorting and O(n) search for each message item.
|
|
42
|
-
if (createdAt != null) {
|
|
43
|
-
const values = Object.values(daysPositions.value)
|
|
44
|
-
for (let i = 0; i < values.length; i++)
|
|
45
|
-
if (values[i].createdAt === createdAt)
|
|
46
|
-
return values[i]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Fallback: sort and search when createdAt is not provided (e.g., from DayAnimated)
|
|
50
|
-
const sortedArray = Object.values(daysPositions.value).sort((a, b) => {
|
|
51
|
-
'worklet'
|
|
52
|
-
|
|
53
|
-
return a.y - b.y
|
|
54
|
-
})
|
|
55
|
-
for (let i = 0; i < sortedArray.length; i++) {
|
|
56
|
-
const day = sortedArray[i]
|
|
57
|
-
const dayPosition = day.y + day.height
|
|
58
|
-
if (absoluteScrolledPositionToBottomOfDay.value < dayPosition || i === sortedArray.length - 1)
|
|
59
|
-
return day
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return undefined
|
|
63
|
-
}, [daysPositions, absoluteScrolledPositionToBottomOfDay, createdAt])
|
|
64
|
-
|
|
65
|
-
const relativeScrolledPositionToBottomOfDay = useDerivedValue(() => {
|
|
66
|
-
const scrolledBottomY = listHeight.value + scrolledY.value - (
|
|
67
|
-
(currentDayPosition.value?.y ?? 0) +
|
|
68
|
-
(currentDayPosition.value?.height ?? 0) +
|
|
69
|
-
dayMarginTop
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
return scrolledBottomY
|
|
73
|
-
}, [listHeight, scrolledY, currentDayPosition, dayMarginTop])
|
|
74
|
-
|
|
75
|
-
return relativeScrolledPositionToBottomOfDay
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const DayWrapper = <TMessage extends IMessage>(props: MessageProps<TMessage>) => {
|
|
79
|
-
const {
|
|
80
|
-
renderDay: renderDayProp,
|
|
81
|
-
currentMessage,
|
|
82
|
-
previousMessage,
|
|
83
|
-
} = props
|
|
84
|
-
|
|
85
|
-
if (!currentMessage?.createdAt || isSameDay(currentMessage, previousMessage))
|
|
86
|
-
return null
|
|
87
|
-
|
|
88
|
-
const {
|
|
89
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
90
|
-
containerStyle,
|
|
91
|
-
onMessageLayout,
|
|
92
|
-
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
93
|
-
...rest
|
|
94
|
-
} = props
|
|
95
|
-
|
|
96
|
-
return (
|
|
97
|
-
<View>
|
|
98
|
-
{
|
|
99
|
-
renderDayProp
|
|
100
|
-
? renderDayProp({ ...rest, createdAt: currentMessage.createdAt })
|
|
101
|
-
: <Day {...rest} createdAt={currentMessage.createdAt} />
|
|
102
|
-
}
|
|
103
|
-
</View>
|
|
104
|
-
)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const AnimatedDayWrapper = <TMessage extends IMessage>(props: ItemProps<TMessage>) => {
|
|
108
|
-
const {
|
|
109
|
-
scrolledY,
|
|
110
|
-
daysPositions,
|
|
111
|
-
listHeight,
|
|
112
|
-
...rest
|
|
113
|
-
} = props
|
|
114
|
-
|
|
115
|
-
const dayContainerHeight = useSharedValue(0)
|
|
116
|
-
const dayTopOffset = useMemo(() => 10, [])
|
|
117
|
-
const dayBottomMargin = useMemo(() => 10, [])
|
|
118
|
-
|
|
119
|
-
const createdAt = useMemo(() =>
|
|
120
|
-
new Date(props.currentMessage.createdAt).getTime()
|
|
121
|
-
, [props.currentMessage.createdAt])
|
|
122
|
-
|
|
123
|
-
const relativeScrolledPositionToBottomOfDay = useRelativeScrolledPositionToBottomOfDay(listHeight, scrolledY, daysPositions, dayContainerHeight, dayBottomMargin, dayTopOffset, createdAt)
|
|
124
|
-
|
|
125
|
-
const handleLayoutDayContainer = useCallback(({ nativeEvent }: LayoutChangeEvent) => {
|
|
126
|
-
dayContainerHeight.value = nativeEvent.layout.height
|
|
127
|
-
}, [dayContainerHeight])
|
|
128
|
-
|
|
129
|
-
const style = useAnimatedStyle(() => ({
|
|
130
|
-
opacity: interpolate(
|
|
131
|
-
relativeScrolledPositionToBottomOfDay.value,
|
|
132
|
-
[
|
|
133
|
-
-dayTopOffset,
|
|
134
|
-
-0.0001,
|
|
135
|
-
0,
|
|
136
|
-
dayContainerHeight.value + dayTopOffset,
|
|
137
|
-
],
|
|
138
|
-
[
|
|
139
|
-
0,
|
|
140
|
-
0,
|
|
141
|
-
1,
|
|
142
|
-
1,
|
|
143
|
-
],
|
|
144
|
-
'clamp'
|
|
145
|
-
),
|
|
146
|
-
}), [relativeScrolledPositionToBottomOfDay, dayContainerHeight, dayTopOffset])
|
|
147
|
-
|
|
148
|
-
return (
|
|
149
|
-
<Animated.View
|
|
150
|
-
style={style}
|
|
151
|
-
onLayout={handleLayoutDayContainer}
|
|
152
|
-
>
|
|
153
|
-
<DayWrapper<TMessage> {...rest as MessageProps<TMessage>} />
|
|
154
|
-
</Animated.View>
|
|
155
|
-
)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export const Item = <TMessage extends IMessage>(props: ItemProps<TMessage>) => {
|
|
159
|
-
const {
|
|
160
|
-
renderMessage: renderMessageProp,
|
|
161
|
-
isDayAnimationEnabled,
|
|
162
|
-
reply,
|
|
163
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
164
|
-
scrolledY: _scrolledY,
|
|
165
|
-
daysPositions: _daysPositions,
|
|
166
|
-
listHeight: _listHeight,
|
|
167
|
-
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
168
|
-
...rest
|
|
169
|
-
} = props
|
|
170
|
-
|
|
171
|
-
// Transform reply props for Message and Bubble
|
|
172
|
-
const messageProps = useMemo(() => ({
|
|
173
|
-
...rest,
|
|
174
|
-
// Swipe to reply for Message component
|
|
175
|
-
swipeToReply: reply?.swipe,
|
|
176
|
-
// Message reply styling for Bubble component
|
|
177
|
-
messageReply: reply ? {
|
|
178
|
-
renderMessageReply: reply.renderMessageReply,
|
|
179
|
-
onPress: reply.onPress,
|
|
180
|
-
...reply.messageStyle,
|
|
181
|
-
} : undefined,
|
|
182
|
-
}), [rest, reply])
|
|
183
|
-
|
|
184
|
-
return (
|
|
185
|
-
// do not remove key. it helps to get correct position of the day container
|
|
186
|
-
<View key={props.currentMessage._id.toString()}>
|
|
187
|
-
{isDayAnimationEnabled
|
|
188
|
-
? <AnimatedDayWrapper<TMessage> {...props} />
|
|
189
|
-
: <DayWrapper<TMessage> {...messageProps as MessageProps<TMessage>} />}
|
|
190
|
-
{
|
|
191
|
-
renderMessageProp
|
|
192
|
-
? renderMessageProp(messageProps as MessageProps<TMessage>)
|
|
193
|
-
: <Message<TMessage> {...messageProps as MessageProps<TMessage>} />
|
|
194
|
-
}
|
|
195
|
-
</View>
|
|
196
|
-
)
|
|
197
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { IMessage } from '../../../Models'
|
|
2
|
-
import { MessagesContainerProps, DaysPositions } from '../../types'
|
|
3
|
-
|
|
4
|
-
export interface ItemProps<TMessage extends IMessage> extends MessagesContainerProps<TMessage> {
|
|
5
|
-
currentMessage: TMessage
|
|
6
|
-
previousMessage?: TMessage
|
|
7
|
-
nextMessage?: TMessage
|
|
8
|
-
position: 'left' | 'right'
|
|
9
|
-
scrolledY: { value: number }
|
|
10
|
-
daysPositions: { value: DaysPositions }
|
|
11
|
-
listHeight: { value: number }
|
|
12
|
-
isDayAnimationEnabled?: boolean
|
|
13
|
-
}
|