@kesha-antonov/react-native-chat 4.1.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.
Files changed (263) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +1087 -0
  3. package/lib/Actions.d.ts +16 -0
  4. package/lib/Actions.d.ts.map +1 -0
  5. package/lib/Actions.js +64 -0
  6. package/lib/Actions.js.map +1 -0
  7. package/lib/Avatar.d.ts +19 -0
  8. package/lib/Avatar.d.ts.map +1 -0
  9. package/lib/Avatar.js +93 -0
  10. package/lib/Avatar.js.map +1 -0
  11. package/lib/Bubble/index.d.ts +6 -0
  12. package/lib/Bubble/index.d.ts.map +1 -0
  13. package/lib/Bubble/index.js +391 -0
  14. package/lib/Bubble/index.js.map +1 -0
  15. package/lib/Bubble/styles.d.ts +57 -0
  16. package/lib/Bubble/styles.d.ts.map +1 -0
  17. package/lib/Bubble/styles.js +59 -0
  18. package/lib/Bubble/styles.js.map +1 -0
  19. package/lib/Bubble/types.d.ts +62 -0
  20. package/lib/Bubble/types.d.ts.map +1 -0
  21. package/lib/Bubble/types.js +2 -0
  22. package/lib/Bubble/types.js.map +1 -0
  23. package/lib/Chat/index.d.ts +10 -0
  24. package/lib/Chat/index.d.ts.map +1 -0
  25. package/lib/Chat/index.js +243 -0
  26. package/lib/Chat/index.js.map +1 -0
  27. package/lib/Chat/styles.d.ts +13 -0
  28. package/lib/Chat/styles.d.ts.map +1 -0
  29. package/lib/Chat/styles.js +13 -0
  30. package/lib/Chat/styles.js.map +1 -0
  31. package/lib/Chat/types.d.ts +102 -0
  32. package/lib/Chat/types.d.ts.map +1 -0
  33. package/lib/Chat/types.js +2 -0
  34. package/lib/Chat/types.js.map +1 -0
  35. package/lib/ChatAvatar.d.ts +12 -0
  36. package/lib/ChatAvatar.d.ts.map +1 -0
  37. package/lib/ChatAvatar.js +100 -0
  38. package/lib/ChatAvatar.js.map +1 -0
  39. package/lib/ChatContext.d.ts +12 -0
  40. package/lib/ChatContext.d.ts.map +1 -0
  41. package/lib/ChatContext.js +10 -0
  42. package/lib/ChatContext.js.map +1 -0
  43. package/lib/Color.d.ts +18 -0
  44. package/lib/Color.d.ts.map +1 -0
  45. package/lib/Color.js +18 -0
  46. package/lib/Color.js.map +1 -0
  47. package/lib/Composer.d.ts +9 -0
  48. package/lib/Composer.d.ts.map +1 -0
  49. package/lib/Composer.js +63 -0
  50. package/lib/Composer.js.map +1 -0
  51. package/lib/Constant.d.ts +8 -0
  52. package/lib/Constant.d.ts.map +1 -0
  53. package/lib/Constant.js +8 -0
  54. package/lib/Constant.js.map +1 -0
  55. package/lib/Day/index.d.ts +5 -0
  56. package/lib/Day/index.d.ts.map +1 -0
  57. package/lib/Day/index.js +39 -0
  58. package/lib/Day/index.js.map +1 -0
  59. package/lib/Day/styles.d.ts +21 -0
  60. package/lib/Day/styles.d.ts.map +1 -0
  61. package/lib/Day/styles.js +22 -0
  62. package/lib/Day/styles.js.map +1 -0
  63. package/lib/Day/types.d.ts +17 -0
  64. package/lib/Day/types.d.ts.map +1 -0
  65. package/lib/Day/types.js +2 -0
  66. package/lib/Day/types.js.map +1 -0
  67. package/lib/InputToolbar.d.ts +36 -0
  68. package/lib/InputToolbar.d.ts.map +1 -0
  69. package/lib/InputToolbar.js +108 -0
  70. package/lib/InputToolbar.js.map +1 -0
  71. package/lib/LoadEarlierMessages.d.ts +17 -0
  72. package/lib/LoadEarlierMessages.d.ts.map +1 -0
  73. package/lib/LoadEarlierMessages.js +44 -0
  74. package/lib/LoadEarlierMessages.js.map +1 -0
  75. package/lib/Message/index.d.ts +6 -0
  76. package/lib/Message/index.d.ts.map +1 -0
  77. package/lib/Message/index.js +180 -0
  78. package/lib/Message/index.js.map +1 -0
  79. package/lib/Message/styles.d.ts +18 -0
  80. package/lib/Message/styles.d.ts.map +1 -0
  81. package/lib/Message/styles.js +18 -0
  82. package/lib/Message/styles.js.map +1 -0
  83. package/lib/Message/types.d.ts +28 -0
  84. package/lib/Message/types.d.ts.map +1 -0
  85. package/lib/Message/types.js +2 -0
  86. package/lib/Message/types.js.map +1 -0
  87. package/lib/MessageAudio.d.ts +3 -0
  88. package/lib/MessageAudio.d.ts.map +1 -0
  89. package/lib/MessageAudio.js +24 -0
  90. package/lib/MessageAudio.js.map +1 -0
  91. package/lib/MessageImage.d.ts +12 -0
  92. package/lib/MessageImage.d.ts.map +1 -0
  93. package/lib/MessageImage.js +164 -0
  94. package/lib/MessageImage.js.map +1 -0
  95. package/lib/MessageReply.d.ts +15 -0
  96. package/lib/MessageReply.d.ts.map +1 -0
  97. package/lib/MessageReply.js +102 -0
  98. package/lib/MessageReply.js.map +1 -0
  99. package/lib/MessageText.d.ts +24 -0
  100. package/lib/MessageText.d.ts.map +1 -0
  101. package/lib/MessageText.js +51 -0
  102. package/lib/MessageText.js.map +1 -0
  103. package/lib/MessageVideo.d.ts +3 -0
  104. package/lib/MessageVideo.d.ts.map +1 -0
  105. package/lib/MessageVideo.js +24 -0
  106. package/lib/MessageVideo.js.map +1 -0
  107. package/lib/MessagesContainer/components/DayAnimated/debug.d.ts +8 -0
  108. package/lib/MessagesContainer/components/DayAnimated/debug.d.ts.map +1 -0
  109. package/lib/MessagesContainer/components/DayAnimated/debug.js +38 -0
  110. package/lib/MessagesContainer/components/DayAnimated/debug.js.map +1 -0
  111. package/lib/MessagesContainer/components/DayAnimated/index.d.ts +5 -0
  112. package/lib/MessagesContainer/components/DayAnimated/index.d.ts.map +1 -0
  113. package/lib/MessagesContainer/components/DayAnimated/index.js +123 -0
  114. package/lib/MessagesContainer/components/DayAnimated/index.js.map +1 -0
  115. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts +12 -0
  116. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts.map +1 -0
  117. package/lib/MessagesContainer/components/DayAnimated/styles.js +12 -0
  118. package/lib/MessagesContainer/components/DayAnimated/styles.js.map +1 -0
  119. package/lib/MessagesContainer/components/DayAnimated/types.d.ts +22 -0
  120. package/lib/MessagesContainer/components/DayAnimated/types.d.ts.map +1 -0
  121. package/lib/MessagesContainer/components/DayAnimated/types.js +2 -0
  122. package/lib/MessagesContainer/components/DayAnimated/types.js.map +1 -0
  123. package/lib/MessagesContainer/components/DayAnimated/useScrollGatedOpacity.d.ts +4 -0
  124. package/lib/MessagesContainer/components/DayAnimated/useScrollGatedOpacity.d.ts.map +1 -0
  125. package/lib/MessagesContainer/components/DayAnimated/useScrollGatedOpacity.js +37 -0
  126. package/lib/MessagesContainer/components/DayAnimated/useScrollGatedOpacity.js.map +1 -0
  127. package/lib/MessagesContainer/components/Item/index.d.ts +6 -0
  128. package/lib/MessagesContainer/components/Item/index.d.ts.map +1 -0
  129. package/lib/MessagesContainer/components/Item/index.js +86 -0
  130. package/lib/MessagesContainer/components/Item/index.js.map +1 -0
  131. package/lib/MessagesContainer/components/Item/types.d.ts +22 -0
  132. package/lib/MessagesContainer/components/Item/types.d.ts.map +1 -0
  133. package/lib/MessagesContainer/components/Item/types.js +2 -0
  134. package/lib/MessagesContainer/components/Item/types.js.map +1 -0
  135. package/lib/MessagesContainer/components/dayLayout.d.ts +10 -0
  136. package/lib/MessagesContainer/components/dayLayout.d.ts.map +1 -0
  137. package/lib/MessagesContainer/components/dayLayout.js +37 -0
  138. package/lib/MessagesContainer/components/dayLayout.js.map +1 -0
  139. package/lib/MessagesContainer/index.d.ts +6 -0
  140. package/lib/MessagesContainer/index.d.ts.map +1 -0
  141. package/lib/MessagesContainer/index.js +308 -0
  142. package/lib/MessagesContainer/index.js.map +1 -0
  143. package/lib/MessagesContainer/styles.d.ts +55 -0
  144. package/lib/MessagesContainer/styles.d.ts.map +1 -0
  145. package/lib/MessagesContainer/styles.js +42 -0
  146. package/lib/MessagesContainer/styles.js.map +1 -0
  147. package/lib/MessagesContainer/types.d.ts +91 -0
  148. package/lib/MessagesContainer/types.d.ts.map +1 -0
  149. package/lib/MessagesContainer/types.js +10 -0
  150. package/lib/MessagesContainer/types.js.map +1 -0
  151. package/lib/Models.d.ts +67 -0
  152. package/lib/Models.d.ts.map +1 -0
  153. package/lib/Models.js +2 -0
  154. package/lib/Models.js.map +1 -0
  155. package/lib/QuickReplies.d.ts +16 -0
  156. package/lib/QuickReplies.d.ts.map +1 -0
  157. package/lib/QuickReplies.js +107 -0
  158. package/lib/QuickReplies.js.map +1 -0
  159. package/lib/Reactions/MessageReactions.d.ts +5 -0
  160. package/lib/Reactions/MessageReactions.d.ts.map +1 -0
  161. package/lib/Reactions/MessageReactions.js +83 -0
  162. package/lib/Reactions/MessageReactions.js.map +1 -0
  163. package/lib/Reactions/ReactionPicker.d.ts +10 -0
  164. package/lib/Reactions/ReactionPicker.d.ts.map +1 -0
  165. package/lib/Reactions/ReactionPicker.js +84 -0
  166. package/lib/Reactions/ReactionPicker.js.map +1 -0
  167. package/lib/Reactions/index.d.ts +6 -0
  168. package/lib/Reactions/index.d.ts.map +1 -0
  169. package/lib/Reactions/index.js +6 -0
  170. package/lib/Reactions/index.js.map +1 -0
  171. package/lib/Reactions/types.d.ts +79 -0
  172. package/lib/Reactions/types.d.ts.map +1 -0
  173. package/lib/Reactions/types.js +2 -0
  174. package/lib/Reactions/types.js.map +1 -0
  175. package/lib/Reply/index.d.ts +2 -0
  176. package/lib/Reply/index.d.ts.map +1 -0
  177. package/lib/Reply/index.js +2 -0
  178. package/lib/Reply/index.js.map +1 -0
  179. package/lib/Reply/types.d.ts +72 -0
  180. package/lib/Reply/types.d.ts.map +1 -0
  181. package/lib/Reply/types.js +2 -0
  182. package/lib/Reply/types.js.map +1 -0
  183. package/lib/ReplyPreview.d.ts +14 -0
  184. package/lib/ReplyPreview.d.ts.map +1 -0
  185. package/lib/ReplyPreview.js +94 -0
  186. package/lib/ReplyPreview.js.map +1 -0
  187. package/lib/Send.d.ts +19 -0
  188. package/lib/Send.d.ts.map +1 -0
  189. package/lib/Send.js +56 -0
  190. package/lib/Send.js.map +1 -0
  191. package/lib/SystemMessage.d.ts +14 -0
  192. package/lib/SystemMessage.d.ts.map +1 -0
  193. package/lib/SystemMessage.js +42 -0
  194. package/lib/SystemMessage.js.map +1 -0
  195. package/lib/Time.d.ts +12 -0
  196. package/lib/Time.d.ts.map +1 -0
  197. package/lib/Time.js +38 -0
  198. package/lib/Time.js.map +1 -0
  199. package/lib/TypingIndicator/index.d.ts +5 -0
  200. package/lib/TypingIndicator/index.d.ts.map +1 -0
  201. package/lib/TypingIndicator/index.js +94 -0
  202. package/lib/TypingIndicator/index.js.map +1 -0
  203. package/lib/TypingIndicator/styles.d.ts +21 -0
  204. package/lib/TypingIndicator/styles.d.ts.map +1 -0
  205. package/lib/TypingIndicator/styles.js +22 -0
  206. package/lib/TypingIndicator/styles.js.map +1 -0
  207. package/lib/TypingIndicator/types.d.ts +6 -0
  208. package/lib/TypingIndicator/types.d.ts.map +1 -0
  209. package/lib/TypingIndicator/types.js +2 -0
  210. package/lib/TypingIndicator/types.js.map +1 -0
  211. package/lib/components/MessageReply.d.ts +29 -0
  212. package/lib/components/MessageReply.d.ts.map +1 -0
  213. package/lib/components/MessageReply.js +87 -0
  214. package/lib/components/MessageReply.js.map +1 -0
  215. package/lib/components/ReplyPreview.d.ts +17 -0
  216. package/lib/components/ReplyPreview.d.ts.map +1 -0
  217. package/lib/components/ReplyPreview.js +148 -0
  218. package/lib/components/ReplyPreview.js.map +1 -0
  219. package/lib/components/StreamingCursor.d.ts +15 -0
  220. package/lib/components/StreamingCursor.d.ts.map +1 -0
  221. package/lib/components/StreamingCursor.js +16 -0
  222. package/lib/components/StreamingCursor.js.map +1 -0
  223. package/lib/components/TouchableOpacity.d.ts +9 -0
  224. package/lib/components/TouchableOpacity.d.ts.map +1 -0
  225. package/lib/components/TouchableOpacity.js +47 -0
  226. package/lib/components/TouchableOpacity.js.map +1 -0
  227. package/lib/hooks/useColorScheme.d.ts +8 -0
  228. package/lib/hooks/useColorScheme.d.ts.map +1 -0
  229. package/lib/hooks/useColorScheme.js +17 -0
  230. package/lib/hooks/useColorScheme.js.map +1 -0
  231. package/lib/hooks/useStreamingMessages.d.ts +42 -0
  232. package/lib/hooks/useStreamingMessages.d.ts.map +1 -0
  233. package/lib/hooks/useStreamingMessages.js +96 -0
  234. package/lib/hooks/useStreamingMessages.js.map +1 -0
  235. package/lib/hooks/useUpdateLayoutEffect.d.ts +9 -0
  236. package/lib/hooks/useUpdateLayoutEffect.d.ts.map +1 -0
  237. package/lib/hooks/useUpdateLayoutEffect.js +17 -0
  238. package/lib/hooks/useUpdateLayoutEffect.js.map +1 -0
  239. package/lib/index.d.ts +35 -0
  240. package/lib/index.d.ts.map +1 -0
  241. package/lib/index.js +34 -0
  242. package/lib/index.js.map +1 -0
  243. package/lib/linkParser.d.ts +39 -0
  244. package/lib/linkParser.d.ts.map +1 -0
  245. package/lib/linkParser.js +154 -0
  246. package/lib/linkParser.js.map +1 -0
  247. package/lib/logging.d.ts +3 -0
  248. package/lib/logging.d.ts.map +1 -0
  249. package/lib/logging.js +5 -0
  250. package/lib/logging.js.map +1 -0
  251. package/lib/styles.d.ts +14 -0
  252. package/lib/styles.d.ts.map +1 -0
  253. package/lib/styles.js +23 -0
  254. package/lib/styles.js.map +1 -0
  255. package/lib/types.d.ts +19 -0
  256. package/lib/types.d.ts.map +1 -0
  257. package/lib/types.js +2 -0
  258. package/lib/types.js.map +1 -0
  259. package/lib/utils.d.ts +8 -0
  260. package/lib/utils.d.ts.map +1 -0
  261. package/lib/utils.js +105 -0
  262. package/lib/utils.js.map +1 -0
  263. package/package.json +119 -0
@@ -0,0 +1,91 @@
1
+ import { RefObject } from 'react';
2
+ import { FlatListProps, StyleProp, ViewStyle } from 'react-native';
3
+ import { FlatList } from 'react-native-gesture-handler';
4
+ import { ScrollEvent } from 'react-native-reanimated';
5
+ import { DayProps } from '../Day';
6
+ import { LoadEarlierMessagesProps } from '../LoadEarlierMessages';
7
+ import { MessageProps } from '../Message';
8
+ import { User, IMessage, Reply } from '../Models';
9
+ import { ReactionsProps } from '../Reactions';
10
+ import { ReplyProps } from '../Reply';
11
+ import { TypingIndicatorProps } from '../TypingIndicator/types';
12
+ /**
13
+ * Typed AnimatedFlatList component that preserves generic type parameter.
14
+ * Uses react-native-gesture-handler's FlatList which respects keyboardShouldPersistTaps.
15
+ */
16
+ export declare const AnimatedFlatList: <TMessage>(props: FlatListProps<TMessage> & {
17
+ ref?: RefObject<FlatList<TMessage>>;
18
+ }) => React.ReactElement;
19
+ export type AnimatedListProps<TMessage extends IMessage = IMessage> = Partial<Omit<FlatListProps<TMessage>, 'onScroll'> & {
20
+ onScroll?: (event: ScrollEvent) => void;
21
+ }>;
22
+ export type AnimatedList<TMessage> = FlatList<TMessage>;
23
+ export interface MessagesContainerProps<TMessage extends IMessage = IMessage> extends Omit<TypingIndicatorProps, 'style'> {
24
+ /** Ref for the FlatList message container */
25
+ forwardRef?: RefObject<AnimatedList<TMessage>>;
26
+ /** Messages to display */
27
+ messages?: TMessage[];
28
+ /** Format to use for rendering dates; default is 'll' */
29
+ dateFormat?: string;
30
+ /** Format to use for rendering relative times */
31
+ dateFormatCalendar?: object;
32
+ /** User sending the messages: { _id, name, avatar } */
33
+ user?: User;
34
+ /** Additional props for FlatList */
35
+ listProps?: AnimatedListProps<TMessage>;
36
+ /** Reverses display order of messages; default is true */
37
+ isInverted?: boolean;
38
+ /** Controls whether or not the message bubbles appear at the top of the chat */
39
+ isAlignedTop?: boolean;
40
+ /** Enables the isScrollToBottomEnabled Component */
41
+ isScrollToBottomEnabled?: boolean;
42
+ /** Scroll to bottom wrapper style */
43
+ scrollToBottomStyle?: StyleProp<ViewStyle>;
44
+ /** Scroll to bottom content style */
45
+ scrollToBottomContentStyle?: StyleProp<ViewStyle>;
46
+ /** Distance from bottom before showing scroll to bottom button */
47
+ scrollToBottomOffset?: number;
48
+ /** Custom component to render when messages are empty */
49
+ renderChatEmpty?: () => React.ReactNode;
50
+ /** Custom footer component on the ListView, e.g. 'User is typing...' */
51
+ renderFooter?: (props: MessagesContainerProps<TMessage>) => React.ReactNode;
52
+ /** Custom message container */
53
+ renderMessage?: (props: MessageProps<TMessage>) => React.ReactElement;
54
+ /** Custom day above a message */
55
+ renderDay?: (props: DayProps) => React.ReactNode;
56
+ /** Custom "Load earlier messages" button */
57
+ renderLoadEarlier?: (props: LoadEarlierMessagesProps) => React.ReactNode;
58
+ /** Custom typing indicator */
59
+ renderTypingIndicator?: () => React.ReactNode;
60
+ /** Scroll to bottom custom component */
61
+ scrollToBottomComponent?: () => React.ReactNode;
62
+ /** Callback when quick reply is sent */
63
+ onQuickReply?: (replies: Reply[]) => void;
64
+ /** Props to pass to the LoadEarlierMessages component. The LoadEarlierMessages button is only visible when isAvailable is true. Includes isAvailable (controls button visibility), isInfiniteScrollEnabled (infinite scroll up when reach the top of messages container, automatically call onPress function if it exists - not yet supported for web), onPress (callback when button is pressed), isLoading (display loading indicator), label (override default "Load earlier messages" text), and styling props (containerStyle, wrapperStyle, textStyle, activityIndicatorStyle, activityIndicatorColor, activityIndicatorSize). */
65
+ loadEarlierMessagesProps?: LoadEarlierMessagesProps;
66
+ /** Style for TypingIndicator component */
67
+ typingIndicatorStyle?: StyleProp<ViewStyle>;
68
+ /** Enable animated day label that appears on scroll; default is true */
69
+ isDayAnimationEnabled?: boolean;
70
+ /** Reply functionality configuration */
71
+ reply?: ReplyProps<TMessage>;
72
+ /** Emoji reactions configuration */
73
+ reactions?: ReactionsProps<TMessage>;
74
+ }
75
+ export interface State {
76
+ showScrollBottom: boolean;
77
+ hasScrolled: boolean;
78
+ }
79
+ interface ViewLayout {
80
+ x: number;
81
+ y: number;
82
+ width: number;
83
+ height: number;
84
+ }
85
+ export type DaysPositions = {
86
+ [key: string]: ViewLayout & {
87
+ createdAt: number;
88
+ };
89
+ };
90
+ export {};
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/MessagesContainer/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FlatList } from 'react-native-gesture-handler';
2
+ import Animated from 'react-native-reanimated';
3
+ /** Animated FlatList created from react-native-gesture-handler's FlatList */
4
+ const RNGHAnimatedFlatList = Animated.createAnimatedComponent(FlatList);
5
+ /**
6
+ * Typed AnimatedFlatList component that preserves generic type parameter.
7
+ * Uses react-native-gesture-handler's FlatList which respects keyboardShouldPersistTaps.
8
+ */
9
+ export const AnimatedFlatList = RNGHAnimatedFlatList;
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/MessagesContainer/types.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,QAAyB,MAAM,yBAAyB,CAAA;AAU/D,6EAA6E;AAC7E,MAAM,oBAAoB,GAAG,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAA;AAEvE;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAIT,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { StyleProp, ViewStyle } from 'react-native';
2
+ export type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
3
+ export interface LeftRightStyle<T> {
4
+ left?: StyleProp<T>;
5
+ right?: StyleProp<T>;
6
+ }
7
+ type renderFunction = (x: unknown) => React.ReactNode;
8
+ export interface User {
9
+ _id: string | number;
10
+ name?: string;
11
+ avatar?: string | number | renderFunction;
12
+ }
13
+ export interface Reply {
14
+ title: string;
15
+ value: string;
16
+ messageId?: number | string;
17
+ }
18
+ export interface QuickReplies {
19
+ type: 'radio' | 'checkbox';
20
+ values: Reply[];
21
+ keepIt?: boolean;
22
+ }
23
+ export interface ReplyMessage extends Pick<IMessage, '_id' | 'text' | 'user' | 'audio' | 'image'> {
24
+ }
25
+ export interface MessageReaction {
26
+ /** The emoji character (e.g. '👍') */
27
+ emoji: string;
28
+ /** IDs of the users who reacted with this emoji */
29
+ userIds: (string | number)[];
30
+ }
31
+ export interface IMessage {
32
+ _id: string | number;
33
+ text: string;
34
+ createdAt: Date | number;
35
+ user: User;
36
+ image?: string;
37
+ video?: string;
38
+ audio?: string;
39
+ system?: boolean;
40
+ sent?: boolean;
41
+ received?: boolean;
42
+ pending?: boolean;
43
+ /** True while this message's text is still being streamed in (shows a typing cursor) */
44
+ streaming?: boolean;
45
+ quickReplies?: QuickReplies;
46
+ replyMessage?: ReplyMessage;
47
+ reactions?: MessageReaction[];
48
+ location?: {
49
+ latitude: number;
50
+ longitude: number;
51
+ };
52
+ }
53
+ export type IChatMessage = IMessage;
54
+ export interface MessageVideoProps<TMessage extends IMessage> {
55
+ currentMessage: TMessage;
56
+ containerStyle?: StyleProp<ViewStyle>;
57
+ videoStyle?: StyleProp<ViewStyle>;
58
+ videoProps?: object;
59
+ }
60
+ export interface MessageAudioProps<TMessage extends IMessage> {
61
+ currentMessage: TMessage;
62
+ containerStyle?: StyleProp<ViewStyle>;
63
+ audioStyle?: StyleProp<ViewStyle>;
64
+ audioProps?: object;
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=Models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["../src/Models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAEnD,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAErD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;CACrB;AAED,KAAK,cAAc,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAA;AAErD,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,CAAA;CAC1C;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;CAAG;AAEpG,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wFAAwF;IACxF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,SAAS,CAAC,EAAE,eAAe,EAAE,CAAA;IAC7B,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAA;AAEnC,MAAM,WAAW,iBAAiB,CAAC,QAAQ,SAAS,QAAQ;IAC1D,cAAc,EAAE,QAAQ,CAAA;IACxB,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACrC,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB,CAAC,QAAQ,SAAS,QAAQ;IAC1D,cAAc,EAAE,QAAQ,CAAA;IACxB,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACrC,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB"}
package/lib/Models.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Models.js","sourceRoot":"","sources":["../src/Models.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { StyleProp, ViewStyle, TextStyle } from 'react-native';
3
+ import { IMessage, Reply } from './Models';
4
+ export interface QuickRepliesProps<TMessage extends IMessage = IMessage> {
5
+ nextMessage?: TMessage;
6
+ currentMessage: TMessage;
7
+ color?: string;
8
+ sendText?: string;
9
+ quickReplyStyle?: StyleProp<ViewStyle>;
10
+ quickReplyTextStyle?: StyleProp<TextStyle>;
11
+ quickReplyContainerStyle?: StyleProp<ViewStyle>;
12
+ onQuickReply?(reply: Reply[]): void;
13
+ renderQuickReplySend?(): React.ReactNode;
14
+ }
15
+ export declare function QuickReplies({ currentMessage, nextMessage, color, quickReplyStyle, quickReplyTextStyle, quickReplyContainerStyle, onQuickReply, sendText, renderQuickReplySend, }: QuickRepliesProps<IMessage>): React.JSX.Element | null;
16
+ //# sourceMappingURL=QuickReplies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuickReplies.d.ts","sourceRoot":"","sources":["../src/QuickReplies.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAC7D,OAAO,EAGL,SAAS,EACT,SAAS,EACT,SAAS,EACH,MAAM,cAAc,CAAA;AAI5B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AA+B1C,MAAM,WAAW,iBAAiB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ;IACrE,WAAW,CAAC,EAAE,QAAQ,CAAA;IACtB,cAAc,EAAE,QAAQ,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IACtC,mBAAmB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1C,wBAAwB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC/C,YAAY,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IACnC,oBAAoB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAA;CACzC;AAQD,wBAAgB,YAAY,CAAE,EAC5B,cAAc,EACd,WAAW,EACX,KAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,QAAiB,EACjB,oBAAoB,GACrB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,4BA6G7B"}
@@ -0,0 +1,107 @@
1
+ import React, { useState, useMemo, useCallback } from 'react';
2
+ import { StyleSheet, View, Text } from 'react-native';
3
+ import { Color } from './Color';
4
+ import { TouchableOpacity } from './components/TouchableOpacity';
5
+ import { warning } from './logging';
6
+ import stylesCommon from './styles';
7
+ const styles = StyleSheet.create({
8
+ container: {
9
+ flexDirection: 'row',
10
+ flexWrap: 'wrap',
11
+ maxWidth: 300,
12
+ },
13
+ quickReply: {
14
+ borderWidth: 1,
15
+ maxWidth: 200,
16
+ paddingVertical: 7,
17
+ paddingHorizontal: 12,
18
+ minHeight: 50,
19
+ borderRadius: 13,
20
+ margin: 3,
21
+ },
22
+ quickReplyText: {
23
+ overflow: 'visible',
24
+ },
25
+ sendLink: {
26
+ borderWidth: 0,
27
+ },
28
+ sendLinkText: {
29
+ color: Color.defaultBlue,
30
+ fontWeight: '600',
31
+ fontSize: 17,
32
+ },
33
+ });
34
+ const sameReply = (currentReply) => (reply) => currentReply.value === reply.value;
35
+ const diffReply = (currentReply) => (reply) => currentReply.value !== reply.value;
36
+ export function QuickReplies({ currentMessage, nextMessage, color = Color.peterRiver, quickReplyStyle, quickReplyTextStyle, quickReplyContainerStyle, onQuickReply, sendText = 'Send', renderQuickReplySend, }) {
37
+ const { type } = currentMessage.quickReplies;
38
+ const [replies, setReplies] = useState([]);
39
+ const shouldComponentDisplay = useMemo(() => {
40
+ const hasReplies = !!currentMessage && !!currentMessage.quickReplies;
41
+ const hasNext = !!nextMessage && !!nextMessage._id;
42
+ const keepIt = currentMessage.quickReplies.keepIt;
43
+ if (hasReplies && !hasNext)
44
+ return true;
45
+ if (hasReplies && hasNext && keepIt)
46
+ return true;
47
+ return false;
48
+ }, [currentMessage, nextMessage]);
49
+ const handleSend = useCallback((repliesData) => () => {
50
+ onQuickReply?.(repliesData.map((reply) => ({
51
+ ...reply,
52
+ messageId: currentMessage._id,
53
+ })));
54
+ }, [onQuickReply, currentMessage]);
55
+ const handlePress = useCallback((reply) => () => {
56
+ if (currentMessage) {
57
+ const { type } = currentMessage.quickReplies;
58
+ switch (type) {
59
+ case 'radio': {
60
+ handleSend([reply])();
61
+ return;
62
+ }
63
+ case 'checkbox': {
64
+ if (replies.find(sameReply(reply)))
65
+ setReplies(replies.filter(diffReply(reply)));
66
+ else
67
+ setReplies([...replies, reply]);
68
+ return;
69
+ }
70
+ default: {
71
+ warning(`onQuickReply unknown type: ${type}`);
72
+ }
73
+ }
74
+ }
75
+ }, [replies, currentMessage, handleSend]);
76
+ const renderSendButton = useMemo(() => {
77
+ if (!replies.length)
78
+ return null;
79
+ return (<TouchableOpacity style={[stylesCommon.centerItems, styles.quickReply, styles.sendLink]} onPress={handleSend(replies)}>
80
+ {renderQuickReplySend?.() || (<Text style={styles.sendLinkText}>{sendText}</Text>)}
81
+ </TouchableOpacity>);
82
+ }, [replies, handleSend, renderQuickReplySend, sendText]);
83
+ if (!shouldComponentDisplay)
84
+ return null;
85
+ return (<View style={[styles.container, quickReplyContainerStyle]}>
86
+ {currentMessage.quickReplies.values.map((reply, index) => {
87
+ const selected = type === 'checkbox' && replies.find(sameReply(reply));
88
+ return (<TouchableOpacity onPress={handlePress(reply)} style={[
89
+ stylesCommon.centerItems,
90
+ styles.quickReply,
91
+ quickReplyStyle,
92
+ { borderColor: color },
93
+ selected && { backgroundColor: color },
94
+ ]} key={`${reply.value}-${index}`}>
95
+ <Text numberOfLines={10} ellipsizeMode='tail' style={[
96
+ styles.quickReplyText,
97
+ { color: selected ? Color.white : color },
98
+ quickReplyTextStyle,
99
+ ]}>
100
+ {reply.title}
101
+ </Text>
102
+ </TouchableOpacity>);
103
+ })}
104
+ {renderSendButton}
105
+ </View>);
106
+ }
107
+ //# sourceMappingURL=QuickReplies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuickReplies.js","sourceRoot":"","sources":["../src/QuickReplies.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,EACL,UAAU,EACV,IAAI,EAIJ,IAAI,EAAE,MAAM,cAAc,CAAA;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,YAAY,MAAM,UAAU,CAAA;AAEnC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,GAAG;KACd;IACD,UAAU,EAAE;QACV,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,GAAG;QACb,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,EAAE;QACrB,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,CAAC;KACV;IACD,cAAc,EAAE;QACd,QAAQ,EAAE,SAAS;KACpB;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,CAAC;KACf;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,KAAK,CAAC,WAAW;QACxB,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,EAAE;KACb;CACF,CAAC,CAAA;AAcF,MAAM,SAAS,GAAG,CAAC,YAAmB,EAAE,EAAE,CAAC,CAAC,KAAY,EAAE,EAAE,CAC1D,YAAY,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAA;AAEpC,MAAM,SAAS,GAAG,CAAC,YAAmB,EAAE,EAAE,CAAC,CAAC,KAAY,EAAE,EAAE,CAC1D,YAAY,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAA;AAEpC,MAAM,UAAU,YAAY,CAAE,EAC5B,cAAc,EACd,WAAW,EACX,KAAK,GAAG,KAAK,CAAC,UAAU,EACxB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,QAAQ,GAAG,MAAM,EACjB,oBAAoB,GACQ;IAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,cAAe,CAAC,YAAa,CAAA;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,EAAE,CAAC,CAAA;IAEnD,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1C,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAe,CAAC,YAAY,CAAA;QACrE,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAY,CAAC,GAAG,CAAA;QACnD,MAAM,MAAM,GAAG,cAAe,CAAC,YAAa,CAAC,MAAM,CAAA;QAEnD,IAAI,UAAU,IAAI,CAAC,OAAO;YACxB,OAAO,IAAI,CAAA;QAEb,IAAI,UAAU,IAAI,OAAO,IAAI,MAAM;YACjC,OAAO,IAAI,CAAA;QAEb,OAAO,KAAK,CAAA;IACd,CAAC,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAA;IAEjC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,WAAoB,EAAE,EAAE,CAAC,GAAG,EAAE;QAC5D,YAAY,EAAE,CACZ,WAAW,CAAC,GAAG,CAAC,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;YACjC,GAAG,KAAK;YACR,SAAS,EAAE,cAAe,CAAC,GAAG;SAC/B,CAAC,CAAC,CACJ,CAAA;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAA;IAElC,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAY,EAAE,EAAE,CAAC,GAAG,EAAE;QACrB,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,YAAa,CAAA;YAC7C,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAA;oBACrB,OAAM;gBACR,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;wBAChC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;;wBAE5C,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;oBAEjC,OAAM;gBACR,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACR,OAAO,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAA;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,CAAC,CACtC,CAAA;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,IAAI,CAAC,OAAO,CAAC,MAAM;YACjB,OAAO,IAAI,CAAA;QAEb,OAAO,CACL,CAAC,gBAAgB,CACf,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CACtE,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAE7B;QAAA,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAC3B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CACpD,CACH;MAAA,EAAE,gBAAgB,CAAC,CACpB,CAAA;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEzD,IAAI,CAAC,sBAAsB;QACzB,OAAO,IAAI,CAAA;IAEb,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC,CACxD;MAAA,CAAC,cAAe,CAAC,YAAa,CAAC,MAAM,CAAC,GAAG,CACvC,CAAC,KAAY,EAAE,KAAa,EAAE,EAAE;YAC9B,MAAM,QAAQ,GACZ,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;YAEvD,OAAO,CACL,CAAC,gBAAgB,CACf,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAC5B,KAAK,CAAC,CAAC;oBACL,YAAY,CAAC,WAAW;oBACxB,MAAM,CAAC,UAAU;oBACjB,eAAe;oBACf,EAAE,WAAW,EAAE,KAAK,EAAE;oBACtB,QAAQ,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE;iBACvC,CAAC,CACF,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAE/B;cAAA,CAAC,IAAI,CACH,aAAa,CAAC,CAAC,EAAE,CAAC,CAClB,aAAa,CAAC,MAAM,CACpB,KAAK,CAAC,CAAC;oBACL,MAAM,CAAC,cAAc;oBACrB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;oBACzC,mBAAmB;iBACpB,CAAC,CAEF;gBAAA,CAAC,KAAK,CAAC,KAAK,CACd;cAAA,EAAE,IAAI,CACR;YAAA,EAAE,gBAAgB,CAAC,CACpB,CAAA;QACH,CAAC,CACF,CACD;MAAA,CAAC,gBAAgB,CACnB;IAAA,EAAE,IAAI,CAAC,CACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { IMessage } from '../Models';
3
+ import { MessageReactionsDisplayProps } from './types';
4
+ export declare const MessageReactions: <TMessage extends IMessage = IMessage>(props: MessageReactionsDisplayProps<TMessage>) => React.ReactElement | null;
5
+ //# sourceMappingURL=MessageReactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageReactions.d.ts","sourceRoot":"","sources":["../../src/Reactions/MessageReactions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AAEtD,eAAO,MAAM,gBAAgB,GAAI,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EACnE,OAAO,4BAA4B,CAAC,QAAQ,CAAC,KAC5C,KAAK,CAAC,YAAY,GAAG,IAwDvB,CAAA"}
@@ -0,0 +1,83 @@
1
+ import React from 'react';
2
+ import { Pressable, StyleSheet, Text, View } from 'react-native';
3
+ import { Color } from '../Color';
4
+ export const MessageReactions = (props) => {
5
+ const { reactions, currentUserId, position, onReactionPress, containerStyle, reactionStyle, reactionActiveStyle, reactionTextStyle, reactionCountStyle, } = props;
6
+ if (!reactions || reactions.length === 0)
7
+ return null;
8
+ return (<View style={[
9
+ styles.container,
10
+ position === 'right' ? styles.containerRight : styles.containerLeft,
11
+ containerStyle,
12
+ ]}>
13
+ {reactions.map(reaction => {
14
+ const isActive = currentUserId != null && reaction.userIds.includes(currentUserId);
15
+ const count = reaction.userIds.length;
16
+ return (<Pressable key={reaction.emoji} onPress={() => onReactionPress?.(reaction.emoji)} style={({ pressed }) => [
17
+ styles.pill,
18
+ isActive ? styles.pillActive : styles.pillInactive,
19
+ isActive ? reactionActiveStyle : reactionStyle,
20
+ pressed && styles.pillPressed,
21
+ ]}>
22
+ <Text style={[styles.emoji, reactionTextStyle]}>{reaction.emoji}</Text>
23
+ {count > 1 && (<Text style={[
24
+ styles.count,
25
+ isActive && styles.countActive,
26
+ reactionCountStyle,
27
+ ]}>
28
+ {count}
29
+ </Text>)}
30
+ </Pressable>);
31
+ })}
32
+ </View>);
33
+ };
34
+ const styles = StyleSheet.create({
35
+ container: {
36
+ flexDirection: 'row',
37
+ flexWrap: 'wrap',
38
+ marginTop: 3,
39
+ gap: 4,
40
+ },
41
+ containerLeft: {
42
+ justifyContent: 'flex-start',
43
+ paddingLeft: 4,
44
+ },
45
+ containerRight: {
46
+ justifyContent: 'flex-end',
47
+ paddingRight: 4,
48
+ },
49
+ pill: {
50
+ flexDirection: 'row',
51
+ alignItems: 'center',
52
+ borderRadius: 12,
53
+ paddingHorizontal: 7,
54
+ paddingVertical: 3,
55
+ borderWidth: 1,
56
+ },
57
+ pillInactive: {
58
+ backgroundColor: 'rgba(0, 0, 0, 0.06)',
59
+ borderColor: 'transparent',
60
+ },
61
+ pillActive: {
62
+ backgroundColor: 'rgba(0, 132, 255, 0.15)',
63
+ borderColor: Color.defaultBlue,
64
+ },
65
+ pillPressed: {
66
+ opacity: 0.7,
67
+ },
68
+ emoji: {
69
+ fontSize: 15,
70
+ lineHeight: 20,
71
+ },
72
+ count: {
73
+ fontSize: 12,
74
+ marginLeft: 3,
75
+ color: Color.black,
76
+ lineHeight: 20,
77
+ },
78
+ countActive: {
79
+ color: Color.defaultBlue,
80
+ fontWeight: '600',
81
+ },
82
+ });
83
+ //# sourceMappingURL=MessageReactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageReactions.js","sourceRoot":"","sources":["../../src/Reactions/MessageReactions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { IMessage } from '../Models';
3
+ import { ReactionPickerProps } from './types';
4
+ /**
5
+ * Lightweight quick-picker shown on long-press: a floating row of emojis
6
+ * anchored to the pressed bubble. For a full emoji browser, pass a custom
7
+ * component via `reactions.renderReactionPicker` (see the example app).
8
+ */
9
+ export declare const ReactionPicker: <TMessage extends IMessage = IMessage>(props: ReactionPickerProps<TMessage>) => React.ReactElement | null;
10
+ //# sourceMappingURL=ReactionPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReactionPicker.d.ts","sourceRoot":"","sources":["../../src/Reactions/ReactionPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAA;AAU1C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAO7C;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EACjE,OAAO,mBAAmB,CAAC,QAAQ,CAAC,KACnC,KAAK,CAAC,YAAY,GAAG,IA+EvB,CAAA"}
@@ -0,0 +1,84 @@
1
+ import React, { useCallback } from 'react';
2
+ import { Dimensions, Modal, Pressable, StyleSheet, Text, View, } from 'react-native';
3
+ const PICKER_HEIGHT = 54;
4
+ const EMOJI_BUTTON_SIZE = 46;
5
+ const PICKER_PADDING_H = 8;
6
+ const PICKER_VERTICAL_OFFSET = 8;
7
+ /**
8
+ * Lightweight quick-picker shown on long-press: a floating row of emojis
9
+ * anchored to the pressed bubble. For a full emoji browser, pass a custom
10
+ * component via `reactions.renderReactionPicker` (see the example app).
11
+ */
12
+ export const ReactionPicker = (props) => {
13
+ const { visible, emojis, onSelect, onDismiss, position, pageX = 0, pageY = 0, bubbleWidth = 0, bubbleHeight = 0, pickerContainerStyle, pickerEmojiStyle, } = props;
14
+ const { width: screenWidth } = Dimensions.get('window');
15
+ const pickerWidth = emojis.length * EMOJI_BUTTON_SIZE + PICKER_PADDING_H * 2;
16
+ const showAbove = pageY >= PICKER_HEIGHT + PICKER_VERTICAL_OFFSET;
17
+ const pickerTop = showAbove
18
+ ? pageY - PICKER_HEIGHT - PICKER_VERTICAL_OFFSET
19
+ : pageY + bubbleHeight + PICKER_VERTICAL_OFFSET;
20
+ let pickerLeft;
21
+ if (position === 'right')
22
+ pickerLeft = pageX + bubbleWidth - pickerWidth;
23
+ else
24
+ pickerLeft = pageX;
25
+ pickerLeft = Math.max(8, Math.min(pickerLeft, screenWidth - pickerWidth - 8));
26
+ const handleSelect = useCallback((emoji) => {
27
+ onSelect(emoji);
28
+ onDismiss();
29
+ }, [onSelect, onDismiss]);
30
+ if (!visible)
31
+ return null;
32
+ return (<Modal transparent visible={visible} onRequestClose={onDismiss} animationType='fade' statusBarTranslucent>
33
+ <Pressable style={StyleSheet.absoluteFill} onPress={onDismiss}/>
34
+
35
+ <View style={[
36
+ styles.picker,
37
+ {
38
+ top: pickerTop,
39
+ left: pickerLeft,
40
+ width: pickerWidth,
41
+ },
42
+ pickerContainerStyle,
43
+ ]}>
44
+ {emojis.map(emoji => (<Pressable key={emoji} onPress={() => handleSelect(emoji)} style={({ pressed }) => [
45
+ styles.emojiButton,
46
+ pressed && styles.emojiButtonPressed,
47
+ ]}>
48
+ <Text style={[styles.emoji, pickerEmojiStyle]}>{emoji}</Text>
49
+ </Pressable>))}
50
+ </View>
51
+ </Modal>);
52
+ };
53
+ const styles = StyleSheet.create({
54
+ picker: {
55
+ position: 'absolute',
56
+ height: PICKER_HEIGHT,
57
+ flexDirection: 'row',
58
+ alignItems: 'center',
59
+ backgroundColor: '#ffffff',
60
+ borderRadius: PICKER_HEIGHT / 2,
61
+ paddingHorizontal: PICKER_PADDING_H,
62
+ shadowColor: '#000',
63
+ shadowOffset: { width: 0, height: 4 },
64
+ shadowOpacity: 0.15,
65
+ shadowRadius: 12,
66
+ elevation: 8,
67
+ },
68
+ emojiButton: {
69
+ width: EMOJI_BUTTON_SIZE,
70
+ height: EMOJI_BUTTON_SIZE,
71
+ justifyContent: 'center',
72
+ alignItems: 'center',
73
+ borderRadius: EMOJI_BUTTON_SIZE / 2,
74
+ },
75
+ emojiButtonPressed: {
76
+ backgroundColor: 'rgba(0, 0, 0, 0.07)',
77
+ transform: [{ scale: 1.2 }],
78
+ },
79
+ emoji: {
80
+ fontSize: 26,
81
+ lineHeight: 32,
82
+ },
83
+ });
84
+ //# sourceMappingURL=ReactionPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReactionPicker.js","sourceRoot":"","sources":["../../src/Reactions/ReactionPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EACL,UAAU,EACV,KAAK,EACL,SAAS,EACT,UAAU,EACV,IAAI,EACJ,IAAI,GACL,MAAM,cAAc,CAAA;AAKrB,MAAM,aAAa,GAAG,EAAE,CAAA;AACxB,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAC5B,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAC1B,MAAM,sBAAsB,GAAG,CAAC,CAAA;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAoC,EACT,EAAE;IAC7B,MAAM,EACJ,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,KAAK,GAAG,CAAC,EACT,KAAK,GAAG,CAAC,EACT,WAAW,GAAG,CAAC,EACf,YAAY,GAAG,CAAC,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,GAAG,KAAK,CAAA;IAET,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEvD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,CAAC,CAAA;IAE5E,MAAM,SAAS,GAAG,KAAK,IAAI,aAAa,GAAG,sBAAsB,CAAA;IACjE,MAAM,SAAS,GAAG,SAAS;QACzB,CAAC,CAAC,KAAK,GAAG,aAAa,GAAG,sBAAsB;QAChD,CAAC,CAAC,KAAK,GAAG,YAAY,GAAG,sBAAsB,CAAA;IAEjD,IAAI,UAAkB,CAAA;IACtB,IAAI,QAAQ,KAAK,OAAO;QACtB,UAAU,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,CAAA;;QAE9C,UAAU,GAAG,KAAK,CAAA;IAEpB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAA;IAE7E,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAAa,EAAE,EAAE;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAA;QACf,SAAS,EAAE,CAAA;IACb,CAAC,EACD,CAAC,QAAQ,EAAE,SAAS,CAAC,CACtB,CAAA;IAED,IAAI,CAAC,OAAO;QACV,OAAO,IAAI,CAAA;IAEb,OAAO,CACL,CAAC,KAAK,CACJ,WAAW,CACX,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,cAAc,CAAC,CAAC,SAAS,CAAC,CAC1B,aAAa,CAAC,MAAM,CACpB,oBAAoB,CAEpB;MAAA,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,EAE9D;;MAAA,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;YACL,MAAM,CAAC,MAAM;YACb;gBACE,GAAG,EAAE,SAAS;gBACd,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,WAAW;aACnB;YACD,oBAAoB;SACrB,CAAC,CAEF;QAAA,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CACnB,CAAC,SAAS,CACR,GAAG,CAAC,CAAC,KAAK,CAAC,CACX,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CACnC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;gBACtB,MAAM,CAAC,WAAW;gBAClB,OAAO,IAAI,MAAM,CAAC,kBAAkB;aACrC,CAAC,CAEF;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAC9D;UAAA,EAAE,SAAS,CAAC,CACb,CAAC,CACJ;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,KAAK,CAAC,CACT,CAAA;AACH,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,aAAa,GAAG,CAAC;QAC/B,iBAAiB,EAAE,gBAAgB;QACnC,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,CAAC;KACb;IACD,WAAW,EAAE;QACX,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,iBAAiB;QACzB,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,YAAY,EAAE,iBAAiB,GAAG,CAAC;KACpC;IACD,kBAAkB,EAAE;QAClB,eAAe,EAAE,qBAAqB;QACtC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;KAC5B;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;KACf;CACF,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export * from './types';
2
+ export { MessageReactions } from './MessageReactions';
3
+ export { ReactionPicker } from './ReactionPicker';
4
+ /** Default set of emojis shown in the reaction quick-picker */
5
+ export declare const DEFAULT_REACTION_EMOJIS: string[];
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Reactions/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,+DAA+D;AAC/D,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAAyC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export * from './types';
2
+ export { MessageReactions } from './MessageReactions';
3
+ export { ReactionPicker } from './ReactionPicker';
4
+ /** Default set of emojis shown in the reaction quick-picker */
5
+ export const DEFAULT_REACTION_EMOJIS = ['👍', '❤️', '😂', '😮', '😢', '👎'];
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Reactions/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,uBAAuB,GAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA"}
@@ -0,0 +1,79 @@
1
+ import React from 'react';
2
+ import { StyleProp, TextStyle, ViewStyle } from 'react-native';
3
+ import { IMessage, MessageReaction } from '../Models';
4
+ /** Props passed to the default (or custom) reactions-display component rendered below each bubble */
5
+ export interface MessageReactionsDisplayProps<TMessage extends IMessage> {
6
+ message: TMessage;
7
+ reactions: MessageReaction[];
8
+ currentUserId?: string | number;
9
+ position: 'left' | 'right';
10
+ onReactionPress?: (emoji: string) => void;
11
+ containerStyle?: StyleProp<ViewStyle>;
12
+ reactionStyle?: StyleProp<ViewStyle>;
13
+ reactionActiveStyle?: StyleProp<ViewStyle>;
14
+ reactionTextStyle?: StyleProp<TextStyle>;
15
+ reactionCountStyle?: StyleProp<TextStyle>;
16
+ }
17
+ /** Props passed to the default (or custom) reaction-picker component shown on long-press */
18
+ export interface ReactionPickerProps<TMessage extends IMessage> {
19
+ visible: boolean;
20
+ message: TMessage;
21
+ emojis: string[];
22
+ onSelect: (emoji: string) => void;
23
+ onDismiss: () => void;
24
+ position: 'left' | 'right';
25
+ /** Horizontal screen-coordinate of the bubble's top-left corner */
26
+ pageX?: number;
27
+ /** Vertical screen-coordinate of the bubble's top edge */
28
+ pageY?: number;
29
+ /** Measured width of the bubble container */
30
+ bubbleWidth?: number;
31
+ /** Measured height of the bubble container */
32
+ bubbleHeight?: number;
33
+ pickerContainerStyle?: StyleProp<ViewStyle>;
34
+ pickerEmojiStyle?: StyleProp<TextStyle>;
35
+ }
36
+ /**
37
+ * Top-level emoji-reactions configuration.
38
+ * Pass this as the `reactions` prop to `<Chat />`.
39
+ */
40
+ export interface ReactionsProps<TMessage extends IMessage> {
41
+ /**
42
+ * Enable emoji reactions on messages.
43
+ * @default false
44
+ */
45
+ isEnabled?: boolean;
46
+ /**
47
+ * Emoji options shown in the quick picker.
48
+ * @default ['👍', '❤️', '😂', '😮', '😢', '👎']
49
+ */
50
+ emojis?: string[];
51
+ /**
52
+ * Called when the user selects an emoji in the picker or taps an existing
53
+ * reaction pill. Toggle logic is left to the consumer.
54
+ */
55
+ onReactionPress?: (message: TMessage, emoji: string) => void;
56
+ /** Override the reactions-display component rendered below the bubble */
57
+ renderReactions?: (props: MessageReactionsDisplayProps<TMessage>) => React.ReactNode;
58
+ /**
59
+ * Override the emoji-picker component shown on long-press.
60
+ * Use this to provide a richer picker (e.g. a full emoji browser).
61
+ * See the example app for a `react-native-emoji-chooser` integration.
62
+ */
63
+ renderReactionPicker?: (props: ReactionPickerProps<TMessage>) => React.ReactNode;
64
+ /** Style for the container wrapping all reaction pills */
65
+ containerStyle?: StyleProp<ViewStyle>;
66
+ /** Style applied to every inactive reaction pill */
67
+ reactionStyle?: StyleProp<ViewStyle>;
68
+ /** Style applied to the current-user's active reaction pill */
69
+ reactionActiveStyle?: StyleProp<ViewStyle>;
70
+ /** Style for the emoji text inside each pill */
71
+ reactionTextStyle?: StyleProp<TextStyle>;
72
+ /** Style for the count label inside each pill */
73
+ reactionCountStyle?: StyleProp<TextStyle>;
74
+ /** Style for the floating quick-picker panel */
75
+ pickerContainerStyle?: StyleProp<ViewStyle>;
76
+ /** Style for each emoji button inside the quick picker */
77
+ pickerEmojiStyle?: StyleProp<TextStyle>;
78
+ }
79
+ //# sourceMappingURL=types.d.ts.map