stream-chat-react-native-core 8.12.0 → 8.12.2

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 (67) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/components/ChannelList/Skeleton.js +4 -2
  3. package/lib/commonjs/components/ChannelList/Skeleton.js.map +1 -1
  4. package/lib/commonjs/components/Message/MessageSimple/MessageWrapper.js +16 -23
  5. package/lib/commonjs/components/Message/MessageSimple/MessageWrapper.js.map +1 -1
  6. package/lib/commonjs/components/MessageList/MessageFlashList.js +12 -9
  7. package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
  8. package/lib/commonjs/components/MessageList/MessageList.js +14 -9
  9. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  10. package/lib/commonjs/components/MessageList/hooks/useMessageDateSeparator.js +1 -10
  11. package/lib/commonjs/components/MessageList/hooks/useMessageDateSeparator.js.map +1 -1
  12. package/lib/commonjs/components/MessageList/hooks/useMessageGroupStyles.js +3 -13
  13. package/lib/commonjs/components/MessageList/hooks/useMessageGroupStyles.js.map +1 -1
  14. package/lib/commonjs/components/MessageList/hooks/useMessageList.js +1 -16
  15. package/lib/commonjs/components/MessageList/hooks/useMessageList.js.map +1 -1
  16. package/lib/commonjs/components/Thread/Thread.js +4 -2
  17. package/lib/commonjs/components/Thread/Thread.js.map +1 -1
  18. package/lib/commonjs/contexts/messageListItemContext/MessageListItemContext.js.map +1 -1
  19. package/lib/commonjs/version.json +1 -1
  20. package/lib/module/components/ChannelList/Skeleton.js +4 -2
  21. package/lib/module/components/ChannelList/Skeleton.js.map +1 -1
  22. package/lib/module/components/Message/MessageSimple/MessageWrapper.js +16 -23
  23. package/lib/module/components/Message/MessageSimple/MessageWrapper.js.map +1 -1
  24. package/lib/module/components/MessageList/MessageFlashList.js +12 -9
  25. package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
  26. package/lib/module/components/MessageList/MessageList.js +14 -9
  27. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  28. package/lib/module/components/MessageList/hooks/useMessageDateSeparator.js +1 -10
  29. package/lib/module/components/MessageList/hooks/useMessageDateSeparator.js.map +1 -1
  30. package/lib/module/components/MessageList/hooks/useMessageGroupStyles.js +3 -13
  31. package/lib/module/components/MessageList/hooks/useMessageGroupStyles.js.map +1 -1
  32. package/lib/module/components/MessageList/hooks/useMessageList.js +1 -16
  33. package/lib/module/components/MessageList/hooks/useMessageList.js.map +1 -1
  34. package/lib/module/components/Thread/Thread.js +4 -2
  35. package/lib/module/components/Thread/Thread.js.map +1 -1
  36. package/lib/module/contexts/messageListItemContext/MessageListItemContext.js.map +1 -1
  37. package/lib/module/version.json +1 -1
  38. package/lib/typescript/components/ChannelList/Skeleton.d.ts.map +1 -1
  39. package/lib/typescript/components/Message/MessageSimple/MessageWrapper.d.ts +2 -0
  40. package/lib/typescript/components/Message/MessageSimple/MessageWrapper.d.ts.map +1 -1
  41. package/lib/typescript/components/MessageList/MessageFlashList.d.ts.map +1 -1
  42. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  43. package/lib/typescript/components/MessageList/hooks/useMessageDateSeparator.d.ts +2 -3
  44. package/lib/typescript/components/MessageList/hooks/useMessageDateSeparator.d.ts.map +1 -1
  45. package/lib/typescript/components/MessageList/hooks/useMessageGroupStyles.d.ts +3 -3
  46. package/lib/typescript/components/MessageList/hooks/useMessageGroupStyles.d.ts.map +1 -1
  47. package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts +0 -2
  48. package/lib/typescript/components/MessageList/hooks/useMessageList.d.ts.map +1 -1
  49. package/lib/typescript/components/MessageList/utils/getGroupStyles.d.ts +2 -2
  50. package/lib/typescript/components/MessageList/utils/getGroupStyles.d.ts.map +1 -1
  51. package/lib/typescript/components/Thread/Thread.d.ts +1 -0
  52. package/lib/typescript/components/Thread/Thread.d.ts.map +1 -1
  53. package/lib/typescript/contexts/messageListItemContext/MessageListItemContext.d.ts +0 -5
  54. package/lib/typescript/contexts/messageListItemContext/MessageListItemContext.d.ts.map +1 -1
  55. package/package.json +2 -2
  56. package/src/components/ChannelList/Skeleton.tsx +3 -1
  57. package/src/components/Message/MessageSimple/MessageWrapper.tsx +8 -19
  58. package/src/components/MessageList/MessageFlashList.tsx +17 -18
  59. package/src/components/MessageList/MessageList.tsx +21 -18
  60. package/src/components/MessageList/__tests__/useMessageDateSeparator.test.ts +5 -13
  61. package/src/components/MessageList/hooks/useMessageDateSeparator.ts +3 -17
  62. package/src/components/MessageList/hooks/useMessageGroupStyles.ts +6 -21
  63. package/src/components/MessageList/hooks/useMessageList.ts +2 -14
  64. package/src/components/MessageList/utils/getGroupStyles.ts +2 -2
  65. package/src/components/Thread/Thread.tsx +3 -1
  66. package/src/contexts/messageListItemContext/MessageListItemContext.tsx +0 -5
  67. package/src/version.json +1 -1
@@ -4,8 +4,8 @@ import type { PaginatedMessageListContextValue } from '../../../contexts/paginat
4
4
  import type { ThreadContextValue } from '../../../contexts/threadContext/ThreadContext';
5
5
  export type MessageGroupStylesParams = {
6
6
  message: LocalMessage;
7
- previousMessage: LocalMessage;
8
- nextMessage: LocalMessage;
7
+ previousMessage?: LocalMessage;
8
+ nextMessage?: LocalMessage;
9
9
  maxTimeBetweenGroupedMessages?: number;
10
10
  dateSeparatorDate?: Date;
11
11
  nextMessageDateSeparatorDate?: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"getGroupStyles.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/utils/getGroupStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2EAA2E,CAAC;AAClI,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAKxF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,eAAe,EAAE,YAAY,CAAC;IAC9B,WAAW,EAAE,YAAY,CAAC;IAC1B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IACzB,4BAA4B,CAAC,EAAE,IAAI,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gCAAgC,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC9F;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,4HAO3B,wBAAwB,KAAG,UAAU,EAsEvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,oBAAoB;;CA0B1D,CAAC"}
1
+ {"version":3,"file":"getGroupStyles.d.ts","sourceRoot":"","sources":["../../../../../src/components/MessageList/utils/getGroupStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2EAA2E,CAAC;AAClI,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAKxF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IACzB,4BAA4B,CAAC,EAAE,IAAI,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gCAAgC,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC9F;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,4HAO3B,wBAAwB,KAAG,UAAU,EAsEvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,oBAAoB;;CA0B1D,CAAC"}
@@ -38,6 +38,7 @@ type ThreadPropsWithContext = Pick<ChatContextValue, 'client'> & Pick<MessagesCo
38
38
  * Call custom function on closing thread if handling thread state elsewhere
39
39
  */
40
40
  onThreadDismount?: () => void;
41
+ shouldUseFlashList?: boolean;
41
42
  };
42
43
  export type ThreadProps = Partial<ThreadPropsWithContext>;
43
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Thread.d.ts","sourceRoot":"","sources":["../../../../src/components/Thread/Thread.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAKtD,OAAO,EAAE,gBAAgB,EAAkB,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EACL,oBAAoB,EAErB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAoB,MAAM,4CAA4C,CAAC;AAElG,OAAO,EAEL,iBAAiB,EAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAoB,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAU9D,KAAK,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAC5D,IAAI,CAAC,oBAAoB,EAAE,aAAa,CAAC,GACzC,IAAI,CACF,kBAAkB,EAChB,aAAa,GACb,gBAAgB,GAChB,2BAA2B,GAC3B,cAAc,GACd,QAAQ,GACR,gBAAgB,CACnB,GAAG;IACF;;;SAGK;IACL,2BAA2B,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD;;;SAGK;IACL,0BAA0B,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvD;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjE,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACtD;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAkFJ,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAE1D;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,WAAW,sBA0BxC,CAAC"}
1
+ {"version":3,"file":"Thread.d.ts","sourceRoot":"","sources":["../../../../src/components/Thread/Thread.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAKtD,OAAO,EAAE,gBAAgB,EAAkB,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EACL,oBAAoB,EAErB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAoB,MAAM,4CAA4C,CAAC;AAElG,OAAO,EAEL,iBAAiB,EAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAoB,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAU9D,KAAK,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAC5D,IAAI,CAAC,oBAAoB,EAAE,aAAa,CAAC,GACzC,IAAI,CACF,kBAAkB,EAChB,aAAa,GACb,gBAAgB,GAChB,2BAA2B,GAC3B,cAAc,GACd,QAAQ,GACR,gBAAgB,CACnB,GAAG;IACF;;;SAGK;IACL,2BAA2B,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD;;;SAGK;IACL,0BAA0B,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvD;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjE,0CAA0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACtD;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAmFJ,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAE1D;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,WAAW,sBA0BxC,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import React, { PropsWithChildren } from 'react';
2
2
  import { MessageListProps } from '../../components/MessageList/MessageList';
3
- import { MessagePreviousAndNextMessageStore } from '../../state-store/message-list-prev-next-state';
4
3
  import { Theme } from '../themeContext/utils/theme';
5
4
  export type MessageListItemContextValue = {
6
5
  /**
@@ -10,10 +9,6 @@ export type MessageListItemContextValue = {
10
9
  * @returns void
11
10
  */
12
11
  goToMessage: (messageId: string) => void;
13
- /**
14
- * Store to get the previous and next message in the message list
15
- */
16
- messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
17
12
  /**
18
13
  * Theme to use for the message list item
19
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MessageListItemContext.d.ts","sourceRoot":"","sources":["../../../../src/contexts/messageListItemContext/MessageListItemContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,gDAAgD,CAAC;AAEpG,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAIpD,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;;OAKG;IACH,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC;;OAEG;IACH,sCAAsC,EAAE,kCAAkC,CAAC;IAC3E;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;CACpD,CAAC;AAEF,eAAO,MAAM,sBAAsB,4CAElC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,sBAGrC,iBAAiB,CAAC;IACnB,KAAK,CAAC,EAAE,2BAA2B,CAAC;CACrC,CAAC,sBAID,CAAC;AAEF,eAAO,MAAM,yBAAyB,mCAUrC,CAAC"}
1
+ {"version":3,"file":"MessageListItemContext.d.ts","sourceRoot":"","sources":["../../../../src/contexts/messageListItemContext/MessageListItemContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAE5E,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAIpD,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;;OAKG;IACH,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;CACpD,CAAC;AAEF,eAAO,MAAM,sBAAsB,4CAElC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,sBAGrC,iBAAiB,CAAC;IACnB,KAAK,CAAC,EAAE,2BAA2B,CAAC;CACrC,CAAC,sBAID,CAAC;AAEF,eAAO,MAAM,yBAAyB,mCAUrC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "stream-chat-react-native-core",
3
3
  "description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
4
- "version": "8.12.0",
4
+ "version": "8.12.2",
5
5
  "author": {
6
6
  "company": "Stream.io Inc",
7
7
  "name": "Stream.io Inc"
@@ -68,7 +68,7 @@
68
68
  ]
69
69
  },
70
70
  "dependencies": {
71
- "@gorhom/bottom-sheet": "^5.1.8",
71
+ "@gorhom/bottom-sheet": "5.1.8",
72
72
  "@ungap/structured-clone": "^1.3.0",
73
73
  "dayjs": "1.11.13",
74
74
  "emoji-regex": "^10.4.0",
@@ -13,6 +13,8 @@ import { Defs, LinearGradient, Path, Rect, Stop, Svg } from 'react-native-svg';
13
13
 
14
14
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
15
15
 
16
+ const AnimatedPath = Animated.createAnimatedComponent(Path);
17
+
16
18
  const paddingLarge = 16;
17
19
  const paddingMedium = 12;
18
20
  const paddingSmall = 8;
@@ -148,7 +150,7 @@ export const Skeleton = () => {
148
150
  </Svg>
149
151
  </Animated.View>
150
152
  <Svg height={height} width={width}>
151
- <Path {...svgAnimatedProps} fill={maskFillColor || white_snow} />
153
+ <AnimatedPath animatedProps={svgAnimatedProps} fill={maskFillColor || white_snow} />
152
154
  </Svg>
153
155
  </View>
154
156
  );
@@ -1,4 +1,4 @@
1
- import React, { useCallback } from 'react';
1
+ import React from 'react';
2
2
 
3
3
  import { View } from 'react-native';
4
4
 
@@ -14,7 +14,6 @@ import { ThemeProvider, useTheme } from '../../../contexts/themeContext/ThemeCon
14
14
 
15
15
  import { useStateStore } from '../../../hooks/useStateStore';
16
16
  import { ChannelUnreadStateStoreType } from '../../../state-store/channel-unread-state';
17
- import { MessagePreviousAndNextMessageStoreType } from '../../../state-store/message-list-prev-next-state';
18
17
 
19
18
  const channelUnreadStateSelector = (state: ChannelUnreadStateStoreType) => ({
20
19
  first_unread_message_id: state.channelUnreadState?.first_unread_message_id,
@@ -25,10 +24,12 @@ const channelUnreadStateSelector = (state: ChannelUnreadStateStoreType) => ({
25
24
 
26
25
  export type MessageWrapperProps = {
27
26
  message: LocalMessage;
27
+ previousMessage?: LocalMessage;
28
+ nextMessage?: LocalMessage;
28
29
  };
29
30
 
30
31
  export const MessageWrapper = React.memo((props: MessageWrapperProps) => {
31
- const { message } = props;
32
+ const { message, previousMessage, nextMessage } = props;
32
33
  const { client } = useChatContext();
33
34
  const {
34
35
  channelUnreadStateStore,
@@ -47,35 +48,23 @@ export const MessageWrapper = React.memo((props: MessageWrapperProps) => {
47
48
  myMessageTheme,
48
49
  shouldShowUnreadUnderlay,
49
50
  } = useMessagesContext();
50
- const {
51
- goToMessage,
52
- onThreadSelect,
53
- noGroupByUser,
54
- modifiedTheme,
55
- messageListPreviousAndNextMessageStore,
56
- } = useMessageListItemContext();
51
+ const { goToMessage, onThreadSelect, noGroupByUser, modifiedTheme } = useMessageListItemContext();
57
52
 
58
53
  const dateSeparatorDate = useMessageDateSeparator({
59
54
  hideDateSeparators,
60
55
  message,
61
- messageListPreviousAndNextMessageStore,
56
+ previousMessage,
62
57
  });
63
58
 
64
- const selector = useCallback(
65
- (state: MessagePreviousAndNextMessageStoreType) => ({
66
- nextMessage: state.messageList[message.id]?.nextMessage,
67
- }),
68
- [message.id],
69
- );
70
- const { nextMessage } = useStateStore(messageListPreviousAndNextMessageStore.state, selector);
71
59
  const isNewestMessage = nextMessage === undefined;
72
60
  const groupStyles = useMessageGroupStyles({
73
61
  dateSeparatorDate,
74
62
  getMessageGroupStyle,
75
63
  maxTimeBetweenGroupedMessages,
76
64
  message,
77
- messageListPreviousAndNextMessageStore,
65
+ nextMessage,
78
66
  noGroupByUser,
67
+ previousMessage,
79
68
  });
80
69
 
81
70
  const { first_unread_message_id, last_read_timestamp, last_read_message_id, unread_messages } =
@@ -254,10 +254,6 @@ const getItemTypeInternal = (message: LocalMessage) => {
254
254
  return 'generic-message';
255
255
  };
256
256
 
257
- const renderItem = ({ item: message }: { item: LocalMessage }) => {
258
- return <MessageWrapper message={message} />;
259
- };
260
-
261
257
  const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) => {
262
258
  const LoadingMoreRecentIndicator = props.threadList
263
259
  ? InlineLoadingMoreRecentThreadIndicator
@@ -350,18 +346,28 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
350
346
  [myMessageThemeString, theme],
351
347
  );
352
348
 
353
- const {
354
- messageListPreviousAndNextMessageStore,
355
- processedMessageList,
356
- rawMessageList,
357
- viewabilityChangedCallback,
358
- } = useMessageList({
349
+ const { processedMessageList, rawMessageList, viewabilityChangedCallback } = useMessageList({
359
350
  isFlashList: true,
360
351
  isLiveStreaming,
361
352
  noGroupByUser,
362
353
  threadList,
363
354
  });
364
355
 
356
+ const renderItem = useCallback(
357
+ ({ item: message, index }: { item: LocalMessage; index: number }) => {
358
+ const previousMessage = processedMessageList[index - 1];
359
+ const nextMessage = processedMessageList[index + 1];
360
+ return (
361
+ <MessageWrapper
362
+ message={message}
363
+ nextMessage={nextMessage}
364
+ previousMessage={previousMessage}
365
+ />
366
+ );
367
+ },
368
+ [processedMessageList],
369
+ );
370
+
365
371
  /**
366
372
  * We need topMessage and channelLastRead values to set the initial scroll position.
367
373
  * So these values only get used if `initialScrollToFirstUnreadMessage` prop is true.
@@ -722,18 +728,11 @@ const MessageFlashListWithContext = (props: MessageFlashListPropsWithContext) =>
722
728
  const messageListItemContextValue: MessageListItemContextValue = useMemo(
723
729
  () => ({
724
730
  goToMessage,
725
- messageListPreviousAndNextMessageStore,
726
731
  modifiedTheme,
727
732
  noGroupByUser,
728
733
  onThreadSelect,
729
734
  }),
730
- [
731
- goToMessage,
732
- messageListPreviousAndNextMessageStore,
733
- modifiedTheme,
734
- noGroupByUser,
735
- onThreadSelect,
736
- ],
735
+ [goToMessage, modifiedTheme, noGroupByUser, onThreadSelect],
737
736
  );
738
737
 
739
738
  const messagesWithImages =
@@ -233,10 +233,6 @@ type MessageListPropsWithContext = Pick<
233
233
  isLiveStreaming?: boolean;
234
234
  };
235
235
 
236
- const renderItem = ({ item: message }: { item: LocalMessage }) => {
237
- return <MessageWrapper message={message} />;
238
- };
239
-
240
236
  /**
241
237
  * The message list component renders a list of messages. It consumes the following contexts:
242
238
  *
@@ -320,16 +316,30 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
320
316
  * NOTE: rawMessageList changes only when messages array state changes
321
317
  * processedMessageList changes on any state change
322
318
  */
323
- const {
324
- messageListPreviousAndNextMessageStore,
325
- processedMessageList,
326
- rawMessageList,
327
- viewabilityChangedCallback,
328
- } = useMessageList({
319
+ const { processedMessageList, rawMessageList, viewabilityChangedCallback } = useMessageList({
329
320
  isLiveStreaming,
330
321
  noGroupByUser,
331
322
  threadList,
332
323
  });
324
+
325
+ const processedMessageListRef = useRef(processedMessageList);
326
+ processedMessageListRef.current = processedMessageList;
327
+
328
+ const renderItem = useCallback(
329
+ ({ item: message, index }: { item: LocalMessage; index: number }) => {
330
+ const previousMessage = processedMessageListRef.current[index + 1];
331
+ const nextMessage = processedMessageListRef.current[index - 1];
332
+ return (
333
+ <MessageWrapper
334
+ message={message}
335
+ nextMessage={nextMessage}
336
+ previousMessage={previousMessage}
337
+ />
338
+ );
339
+ },
340
+ [processedMessageListRef],
341
+ );
342
+
333
343
  const messageListLengthBeforeUpdate = useRef(0);
334
344
  const messageListLengthAfterUpdate = processedMessageList.length;
335
345
 
@@ -771,18 +781,11 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
771
781
  const messageListItemContextValue: MessageListItemContextValue = useMemo(
772
782
  () => ({
773
783
  goToMessage,
774
- messageListPreviousAndNextMessageStore,
775
784
  modifiedTheme,
776
785
  noGroupByUser,
777
786
  onThreadSelect,
778
787
  }),
779
- [
780
- goToMessage,
781
- messageListPreviousAndNextMessageStore,
782
- modifiedTheme,
783
- noGroupByUser,
784
- onThreadSelect,
785
- ],
788
+ [goToMessage, modifiedTheme, noGroupByUser, onThreadSelect],
786
789
  );
787
790
 
788
791
  /**
@@ -2,15 +2,12 @@ import { renderHook } from '@testing-library/react-native';
2
2
 
3
3
  import { LocalMessage } from 'stream-chat';
4
4
 
5
- import { MessagePreviousAndNextMessageStore } from '../../../state-store/message-list-prev-next-state';
6
5
  import { useMessageDateSeparator } from '../hooks/useMessageDateSeparator';
7
6
 
8
7
  describe('useMessageDateSeparator', () => {
9
- let messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
10
8
  let messages: LocalMessage[];
11
9
 
12
10
  beforeEach(() => {
13
- messageListPreviousAndNextMessageStore = new MessagePreviousAndNextMessageStore();
14
11
  messages = [
15
12
  {
16
13
  created_at: new Date('2020-01-01T00:00:00.000Z'),
@@ -28,13 +25,10 @@ describe('useMessageDateSeparator', () => {
28
25
  text: 'Hello World',
29
26
  },
30
27
  ] as LocalMessage[];
31
- messageListPreviousAndNextMessageStore.setMessageListPreviousAndNextMessage({ messages });
32
28
  });
33
29
 
34
30
  it('should return undefined if no message is passed', () => {
35
- const { result } = renderHook(() =>
36
- useMessageDateSeparator({ message: undefined, messageListPreviousAndNextMessageStore }),
37
- );
31
+ const { result } = renderHook(() => useMessageDateSeparator({ message: undefined }));
38
32
  expect(result.current).toBeUndefined();
39
33
  });
40
34
 
@@ -43,7 +37,7 @@ describe('useMessageDateSeparator', () => {
43
37
  useMessageDateSeparator({
44
38
  hideDateSeparators: true,
45
39
  message: messages[1],
46
- messageListPreviousAndNextMessageStore,
40
+ previousMessage: messages[0],
47
41
  }),
48
42
  );
49
43
  expect(result.current).toBeUndefined();
@@ -51,7 +45,7 @@ describe('useMessageDateSeparator', () => {
51
45
 
52
46
  it('should return the date separator for a message if previous message is not the same day', () => {
53
47
  const { result } = renderHook(() =>
54
- useMessageDateSeparator({ message: messages[1], messageListPreviousAndNextMessageStore }),
48
+ useMessageDateSeparator({ message: messages[1], previousMessage: messages[0] }),
55
49
  );
56
50
  expect(result.current).toBe(messages[1].created_at);
57
51
  });
@@ -69,14 +63,12 @@ describe('useMessageDateSeparator', () => {
69
63
  text: 'World',
70
64
  },
71
65
  ] as LocalMessage[];
72
- const messageListPreviousAndNextMessageStore = new MessagePreviousAndNextMessageStore();
73
- messageListPreviousAndNextMessageStore.setMessageListPreviousAndNextMessage({ messages });
74
66
  const { result: resultOfFirstMessage } = renderHook(() =>
75
- useMessageDateSeparator({ message: messages[0], messageListPreviousAndNextMessageStore }),
67
+ useMessageDateSeparator({ message: messages[0], previousMessage: undefined }),
76
68
  );
77
69
  expect(resultOfFirstMessage.current).toBe(messages[0].created_at);
78
70
  const { result: resultOfSecondMessage } = renderHook(() =>
79
- useMessageDateSeparator({ message: messages[1], messageListPreviousAndNextMessageStore }),
71
+ useMessageDateSeparator({ message: messages[1], previousMessage: messages[0] }),
80
72
  );
81
73
  expect(resultOfSecondMessage.current).toBeUndefined();
82
74
  });
@@ -1,13 +1,7 @@
1
- import { useCallback, useMemo } from 'react';
1
+ import { useMemo } from 'react';
2
2
 
3
3
  import { LocalMessage } from 'stream-chat';
4
4
 
5
- import { useStateStore } from '../../../hooks/useStateStore';
6
- import {
7
- MessagePreviousAndNextMessageStore,
8
- MessagePreviousAndNextMessageStoreType,
9
- } from '../../../state-store/message-list-prev-next-state';
10
-
11
5
  export const getDateSeparatorValue = ({
12
6
  hideDateSeparators,
13
7
  message,
@@ -37,20 +31,12 @@ export const getDateSeparatorValue = ({
37
31
  export const useMessageDateSeparator = ({
38
32
  hideDateSeparators,
39
33
  message,
40
- messageListPreviousAndNextMessageStore,
34
+ previousMessage,
41
35
  }: {
42
36
  hideDateSeparators?: boolean;
43
37
  message?: LocalMessage;
44
- messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
38
+ previousMessage?: LocalMessage;
45
39
  }) => {
46
- const selector = useCallback(
47
- (state: MessagePreviousAndNextMessageStoreType) => ({
48
- previousMessage: message ? state.messageList[message.id]?.previousMessage : undefined,
49
- }),
50
- [message],
51
- );
52
- const { previousMessage } = useStateStore(messageListPreviousAndNextMessageStore.state, selector);
53
-
54
40
  const dateSeparatorDate = useMemo(() => {
55
41
  if (!message && !previousMessage) {
56
42
  return undefined;
@@ -1,15 +1,10 @@
1
- import { useCallback, useMemo } from 'react';
1
+ import { useMemo } from 'react';
2
2
 
3
3
  import { LocalMessage } from 'stream-chat';
4
4
 
5
5
  import { useMessageDateSeparator } from './useMessageDateSeparator';
6
6
 
7
7
  import { MessagesContextValue } from '../../../contexts/messagesContext/MessagesContext';
8
- import { useStateStore } from '../../../hooks/useStateStore';
9
- import {
10
- MessagePreviousAndNextMessageStore,
11
- MessagePreviousAndNextMessageStoreType,
12
- } from '../../../state-store/message-list-prev-next-state';
13
8
  import { getGroupStyle } from '../utils/getGroupStyles';
14
9
 
15
10
  /**
@@ -20,7 +15,8 @@ export const useMessageGroupStyles = ({
20
15
  dateSeparatorDate,
21
16
  maxTimeBetweenGroupedMessages,
22
17
  message,
23
- messageListPreviousAndNextMessageStore,
18
+ previousMessage,
19
+ nextMessage,
24
20
  getMessageGroupStyle = getGroupStyle,
25
21
  }: {
26
22
  noGroupByUser?: boolean;
@@ -28,24 +24,13 @@ export const useMessageGroupStyles = ({
28
24
  dateSeparatorDate?: Date;
29
25
  maxTimeBetweenGroupedMessages?: number;
30
26
  message: LocalMessage;
31
- messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
27
+ previousMessage?: LocalMessage;
28
+ nextMessage?: LocalMessage;
32
29
  }) => {
33
- const selector = useCallback(
34
- (state: MessagePreviousAndNextMessageStoreType) => ({
35
- nextMessage: state.messageList[message.id]?.nextMessage,
36
- previousMessage: state.messageList[message.id]?.previousMessage,
37
- }),
38
- [message.id],
39
- );
40
- const { previousMessage, nextMessage } = useStateStore(
41
- messageListPreviousAndNextMessageStore.state,
42
- selector,
43
- );
44
-
45
30
  // This is needed to calculate the group styles for the next message
46
31
  const nextMessageDateSeparatorDate = useMessageDateSeparator({
47
32
  message: nextMessage,
48
- messageListPreviousAndNextMessageStore,
33
+ previousMessage: message,
49
34
  });
50
35
 
51
36
  const groupStyles = useMemo(() => {
@@ -1,4 +1,4 @@
1
- import { useEffect, useMemo, useRef, useState } from 'react';
1
+ import { useMemo, useRef } from 'react';
2
2
 
3
3
  import type { LocalMessage } from 'stream-chat';
4
4
 
@@ -12,7 +12,6 @@ import { usePaginatedMessageListContext } from '../../../contexts/paginatedMessa
12
12
  import { useThreadContext } from '../../../contexts/threadContext/ThreadContext';
13
13
 
14
14
  import { useRAFCoalescedValue } from '../../../hooks';
15
- import { MessagePreviousAndNextMessageStore } from '../../../state-store/message-list-prev-next-state';
16
15
  import { DateSeparators, getDateSeparators } from '../utils/getDateSeparators';
17
16
  import { getGroupStyles } from '../utils/getGroupStyles';
18
17
 
@@ -70,9 +69,6 @@ export const useMessageList = (params: UseMessageListParams) => {
70
69
  const { messages, viewabilityChangedCallback } = usePaginatedMessageListContext();
71
70
  const { threadMessages } = useThreadContext();
72
71
  const messageList = threadList ? threadMessages : messages;
73
- const [messageListPreviousAndNextMessageStore] = useState(
74
- () => new MessagePreviousAndNextMessageStore(),
75
- );
76
72
 
77
73
  const processedMessageList = useMemo<LocalMessage[]>(() => {
78
74
  const newMessageList = [];
@@ -94,13 +90,6 @@ export const useMessageList = (params: UseMessageListParams) => {
94
90
  return newMessageList;
95
91
  }, [messageList, deletedMessagesVisibilityType, client.userID, isFlashList]);
96
92
 
97
- useEffect(() => {
98
- messageListPreviousAndNextMessageStore.setMessageListPreviousAndNextMessage({
99
- isFlashList,
100
- messages: processedMessageList,
101
- });
102
- }, [processedMessageList, messageListPreviousAndNextMessageStore, isFlashList]);
103
-
104
93
  /**
105
94
  * @deprecated use `useDateSeparator` hook instead directly in the Message.
106
95
  */
@@ -156,13 +145,12 @@ export const useMessageList = (params: UseMessageListParams) => {
156
145
  dateSeparatorsRef,
157
146
  /** Message group styles */
158
147
  messageGroupStylesRef,
159
- messageListPreviousAndNextMessageStore,
160
148
  /** Messages enriched with dates/readby/groups and also reversed in order */
161
149
  processedMessageList: data,
162
150
  /** Raw messages from the channel state */
163
151
  rawMessageList: messageList,
164
152
  viewabilityChangedCallback,
165
153
  }),
166
- [data, messageList, messageListPreviousAndNextMessageStore, viewabilityChangedCallback],
154
+ [data, messageList, viewabilityChangedCallback],
167
155
  );
168
156
  };
@@ -10,8 +10,8 @@ import type { GroupType } from '../hooks/useMessageList';
10
10
 
11
11
  export type MessageGroupStylesParams = {
12
12
  message: LocalMessage;
13
- previousMessage: LocalMessage;
14
- nextMessage: LocalMessage;
13
+ previousMessage?: LocalMessage;
14
+ nextMessage?: LocalMessage;
15
15
  maxTimeBetweenGroupedMessages?: number;
16
16
  dateSeparatorDate?: Date;
17
17
  nextMessageDateSeparatorDate?: Date;
@@ -68,6 +68,7 @@ type ThreadPropsWithContext = Pick<ChatContextValue, 'client'> &
68
68
  * Call custom function on closing thread if handling thread state elsewhere
69
69
  */
70
70
  onThreadDismount?: () => void;
71
+ shouldUseFlashList?: boolean;
71
72
  };
72
73
 
73
74
  const ThreadWithContext = (props: ThreadPropsWithContext) => {
@@ -86,6 +87,7 @@ const ThreadWithContext = (props: ThreadPropsWithContext) => {
86
87
  parentMessagePreventPress = true,
87
88
  thread,
88
89
  threadInstance,
90
+ shouldUseFlashList = false,
89
91
  } = props;
90
92
 
91
93
  useEffect(() => {
@@ -125,7 +127,7 @@ const ThreadWithContext = (props: ThreadPropsWithContext) => {
125
127
 
126
128
  return (
127
129
  <React.Fragment key={`thread-${thread.id}`}>
128
- {FlashList ? (
130
+ {FlashList && shouldUseFlashList ? (
129
131
  <MessageFlashList
130
132
  HeaderComponent={MemoizedThreadFooterComponent}
131
133
  threadList
@@ -1,7 +1,6 @@
1
1
  import React, { createContext, PropsWithChildren, useContext } from 'react';
2
2
 
3
3
  import { MessageListProps } from '../../components/MessageList/MessageList';
4
- import { MessagePreviousAndNextMessageStore } from '../../state-store/message-list-prev-next-state';
5
4
 
6
5
  import { Theme } from '../themeContext/utils/theme';
7
6
  import { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';
@@ -15,10 +14,6 @@ export type MessageListItemContextValue = {
15
14
  * @returns void
16
15
  */
17
16
  goToMessage: (messageId: string) => void;
18
- /**
19
- * Store to get the previous and next message in the message list
20
- */
21
- messageListPreviousAndNextMessageStore: MessagePreviousAndNextMessageStore;
22
17
  /**
23
18
  * Theme to use for the message list item
24
19
  */
package/src/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "8.12.0"
2
+ "version": "8.12.2"
3
3
  }