stream-chat-react-native-core 9.0.1-beta.2 → 9.0.1-beta.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.
Files changed (74) hide show
  1. package/lib/commonjs/components/Channel/Channel.js +2 -0
  2. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  3. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js +3 -1
  4. package/lib/commonjs/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  5. package/lib/commonjs/components/Message/Message.js +99 -74
  6. package/lib/commonjs/components/Message/Message.js.map +1 -1
  7. package/lib/commonjs/components/Message/MessageOverlayWrapper.js +64 -0
  8. package/lib/commonjs/components/Message/MessageOverlayWrapper.js.map +1 -0
  9. package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js +5 -1
  10. package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js.map +1 -1
  11. package/lib/commonjs/components/Message/hooks/useShouldUseOverlayStyles.js +8 -1
  12. package/lib/commonjs/components/Message/hooks/useShouldUseOverlayStyles.js.map +1 -1
  13. package/lib/commonjs/components/Message/messageOverlayConstants.js +6 -0
  14. package/lib/commonjs/components/Message/messageOverlayConstants.js.map +1 -0
  15. package/lib/commonjs/components/index.js +11 -0
  16. package/lib/commonjs/components/index.js.map +1 -1
  17. package/lib/commonjs/contexts/messageContext/MessageContext.js +32 -1
  18. package/lib/commonjs/contexts/messageContext/MessageContext.js.map +1 -1
  19. package/lib/commonjs/contexts/messagesContext/MessagesContext.js.map +1 -1
  20. package/lib/commonjs/version.json +1 -1
  21. package/lib/module/components/Channel/Channel.js +2 -0
  22. package/lib/module/components/Channel/Channel.js.map +1 -1
  23. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js +3 -1
  24. package/lib/module/components/Channel/hooks/useCreateMessagesContext.js.map +1 -1
  25. package/lib/module/components/Message/Message.js +99 -74
  26. package/lib/module/components/Message/Message.js.map +1 -1
  27. package/lib/module/components/Message/MessageOverlayWrapper.js +64 -0
  28. package/lib/module/components/Message/MessageOverlayWrapper.js.map +1 -0
  29. package/lib/module/components/Message/hooks/useCreateMessageContext.js +5 -1
  30. package/lib/module/components/Message/hooks/useCreateMessageContext.js.map +1 -1
  31. package/lib/module/components/Message/hooks/useShouldUseOverlayStyles.js +8 -1
  32. package/lib/module/components/Message/hooks/useShouldUseOverlayStyles.js.map +1 -1
  33. package/lib/module/components/Message/messageOverlayConstants.js +6 -0
  34. package/lib/module/components/Message/messageOverlayConstants.js.map +1 -0
  35. package/lib/module/components/index.js +11 -0
  36. package/lib/module/components/index.js.map +1 -1
  37. package/lib/module/contexts/messageContext/MessageContext.js +32 -1
  38. package/lib/module/contexts/messageContext/MessageContext.js.map +1 -1
  39. package/lib/module/contexts/messagesContext/MessagesContext.js.map +1 -1
  40. package/lib/module/version.json +1 -1
  41. package/lib/typescript/components/Channel/Channel.d.ts +1 -1
  42. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  43. package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts +1 -1
  44. package/lib/typescript/components/Channel/hooks/useCreateMessagesContext.d.ts.map +1 -1
  45. package/lib/typescript/components/Message/Message.d.ts +1 -1
  46. package/lib/typescript/components/Message/Message.d.ts.map +1 -1
  47. package/lib/typescript/components/Message/MessageOverlayWrapper.d.ts +18 -0
  48. package/lib/typescript/components/Message/MessageOverlayWrapper.d.ts.map +1 -0
  49. package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts +1 -1
  50. package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts.map +1 -1
  51. package/lib/typescript/components/Message/hooks/useShouldUseOverlayStyles.d.ts.map +1 -1
  52. package/lib/typescript/components/Message/messageOverlayConstants.d.ts +2 -0
  53. package/lib/typescript/components/Message/messageOverlayConstants.d.ts.map +1 -0
  54. package/lib/typescript/components/index.d.ts +1 -0
  55. package/lib/typescript/components/index.d.ts.map +1 -1
  56. package/lib/typescript/contexts/messageContext/MessageContext.d.ts +26 -0
  57. package/lib/typescript/contexts/messageContext/MessageContext.d.ts.map +1 -1
  58. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts +5 -0
  59. package/lib/typescript/contexts/messagesContext/MessagesContext.d.ts.map +1 -1
  60. package/package.json +1 -1
  61. package/src/components/Channel/Channel.tsx +3 -0
  62. package/src/components/Channel/hooks/useCreateMessagesContext.ts +3 -0
  63. package/src/components/Message/Message.tsx +109 -77
  64. package/src/components/Message/MessageItemView/__tests__/Message.test.js +87 -7
  65. package/src/components/Message/MessageOverlayWrapper.tsx +81 -0
  66. package/src/components/Message/hooks/__tests__/useShouldUseOverlayStyles.test.tsx +17 -2
  67. package/src/components/Message/hooks/useCreateMessageContext.ts +5 -0
  68. package/src/components/Message/hooks/useShouldUseOverlayStyles.ts +15 -2
  69. package/src/components/Message/messageOverlayConstants.ts +1 -0
  70. package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap +12 -4
  71. package/src/components/index.ts +1 -0
  72. package/src/contexts/messageContext/MessageContext.tsx +44 -0
  73. package/src/contexts/messagesContext/MessagesContext.tsx +5 -0
  74. package/src/version.json +1 -1
@@ -4,10 +4,12 @@ import { act, cleanup, renderHook } from '@testing-library/react-native';
4
4
 
5
5
  import {
6
6
  MessageContextValue,
7
+ MessageOverlayRuntimeProvider,
7
8
  MessageProvider,
8
9
  } from '../../../../contexts/messageContext/MessageContext';
9
10
  import { generateMessage } from '../../../../mock-builders/generator/message';
10
11
  import { finalizeCloseOverlay, openOverlay, overlayStore } from '../../../../state-store';
12
+ import { DEFAULT_MESSAGE_OVERLAY_TARGET_ID } from '../../messageOverlayConstants';
11
13
 
12
14
  import { useShouldUseOverlayStyles } from '../useShouldUseOverlayStyles';
13
15
 
@@ -22,6 +24,7 @@ const createMessageContextValue = (overrides: Partial<MessageContextValue>): Mes
22
24
  groupStyles: [],
23
25
  handleAction: jest.fn(),
24
26
  handleToggleReaction: jest.fn(),
27
+ hasAttachmentActions: false,
25
28
  hasReactions: false,
26
29
  images: [],
27
30
  isMessageAIGenerated: jest.fn(),
@@ -29,6 +32,7 @@ const createMessageContextValue = (overrides: Partial<MessageContextValue>): Mes
29
32
  lastGroupMessage: false,
30
33
  members: {},
31
34
  message: generateMessage({ id: 'shared-message-id' }),
35
+ contextMenuAnchorRef: { current: null },
32
36
  messageContentOrder: [],
33
37
  messageHasOnlySingleAttachment: false,
34
38
  messageOverlayId: 'message-overlay-default',
@@ -38,6 +42,7 @@ const createMessageContextValue = (overrides: Partial<MessageContextValue>): Mes
38
42
  onPress: jest.fn(),
39
43
  onPressIn: null,
40
44
  otherAttachments: [],
45
+ registerMessageOverlayTarget: jest.fn(),
41
46
  reactions: [],
42
47
  readBy: false,
43
48
  setQuotedMessage: jest.fn(),
@@ -46,13 +51,23 @@ const createMessageContextValue = (overrides: Partial<MessageContextValue>): Mes
46
51
  showReactionsOverlay: jest.fn(),
47
52
  showMessageStatus: false,
48
53
  threadList: false,
54
+ unregisterMessageOverlayTarget: jest.fn(),
49
55
  videos: [],
50
56
  ...overrides,
51
57
  }) as MessageContextValue;
52
58
 
53
- const createWrapper = (value: MessageContextValue) => {
59
+ const createWrapper = (
60
+ value: MessageContextValue,
61
+ runtimeValue = {
62
+ overlayTargetRectRef: { current: undefined },
63
+ messageOverlayTargetId: DEFAULT_MESSAGE_OVERLAY_TARGET_ID,
64
+ overlayActive: false,
65
+ },
66
+ ) => {
54
67
  const Wrapper = ({ children }: PropsWithChildren) => (
55
- <MessageProvider value={value}>{children}</MessageProvider>
68
+ <MessageProvider value={value}>
69
+ <MessageOverlayRuntimeProvider value={runtimeValue}>{children}</MessageOverlayRuntimeProvider>
70
+ </MessageProvider>
56
71
  );
57
72
 
58
73
  return Wrapper;
@@ -47,6 +47,8 @@ export const useCreateMessageContext = ({
47
47
  onThreadSelect,
48
48
  otherAttachments,
49
49
  preventPress,
50
+ registerMessageOverlayTarget,
51
+ unregisterMessageOverlayTarget,
50
52
  reactions,
51
53
  readBy,
52
54
  showAvatar,
@@ -102,6 +104,8 @@ export const useCreateMessageContext = ({
102
104
  onThreadSelect,
103
105
  otherAttachments,
104
106
  preventPress,
107
+ registerMessageOverlayTarget,
108
+ unregisterMessageOverlayTarget,
105
109
  reactions,
106
110
  readBy,
107
111
  setQuotedMessage,
@@ -134,6 +138,7 @@ export const useCreateMessageContext = ({
134
138
  showMessageStatus,
135
139
  threadList,
136
140
  preventPress,
141
+ unregisterMessageOverlayTarget,
137
142
  ],
138
143
  );
139
144
 
@@ -1,9 +1,22 @@
1
- import { useMessageContext } from '../../../contexts';
1
+ import {
2
+ useMessageContext,
3
+ useMessageOverlayRuntimeContext,
4
+ useMessageOverlayTargetContext,
5
+ } from '../../../contexts';
2
6
  import { useIsOverlayActive } from '../../../state-store';
7
+ import { DEFAULT_MESSAGE_OVERLAY_TARGET_ID } from '../messageOverlayConstants';
3
8
 
4
9
  export const useShouldUseOverlayStyles = () => {
5
10
  const { messageOverlayId } = useMessageContext();
11
+ const { messageOverlayTargetId } = useMessageOverlayRuntimeContext();
12
+ const isWithinMessageOverlayTarget = useMessageOverlayTargetContext();
6
13
  const { active, closing } = useIsOverlayActive(messageOverlayId);
7
14
 
8
- return active && !closing;
15
+ if (!active || closing) {
16
+ return false;
17
+ }
18
+
19
+ return messageOverlayTargetId === DEFAULT_MESSAGE_OVERLAY_TARGET_ID
20
+ ? true
21
+ : isWithinMessageOverlayTarget;
9
22
  };
@@ -0,0 +1 @@
1
+ export const DEFAULT_MESSAGE_OVERLAY_TARGET_ID = '@stream-io/message-root';
@@ -368,7 +368,9 @@ exports[`Thread should match thread snapshot 1`] = `
368
368
  >
369
369
  <View />
370
370
  <View>
371
- <View>
371
+ <View
372
+ collapsable={false}
373
+ >
372
374
  <View
373
375
  collapsable={false}
374
376
  hitSlop={
@@ -707,7 +709,9 @@ exports[`Thread should match thread snapshot 1`] = `
707
709
  >
708
710
  <View />
709
711
  <View>
710
- <View>
712
+ <View
713
+ collapsable={false}
714
+ >
711
715
  <View
712
716
  collapsable={false}
713
717
  hitSlop={
@@ -1079,7 +1083,9 @@ exports[`Thread should match thread snapshot 1`] = `
1079
1083
  >
1080
1084
  <View />
1081
1085
  <View>
1082
- <View>
1086
+ <View
1087
+ collapsable={false}
1088
+ >
1083
1089
  <View
1084
1090
  collapsable={false}
1085
1091
  hitSlop={
@@ -1408,7 +1414,9 @@ exports[`Thread should match thread snapshot 1`] = `
1408
1414
  >
1409
1415
  <View />
1410
1416
  <View>
1411
- <View>
1417
+ <View
1418
+ collapsable={false}
1419
+ >
1412
1420
  <View
1413
1421
  collapsable={false}
1414
1422
  hitSlop={
@@ -87,6 +87,7 @@ export * from './Message/hooks/useStreamingMessage';
87
87
  export * from './Message/hooks/useMessageDeliveryData';
88
88
  export * from './Message/hooks/useMessageReadData';
89
89
  export * from './Message/Message';
90
+ export * from './Message/MessageOverlayWrapper';
90
91
  export * from './Message/MessageItemView/MessageAuthor';
91
92
  export * from './Message/MessageItemView/MessageBounce';
92
93
  export * from './Message/MessageItemView/MessageBlocked';
@@ -9,11 +9,13 @@ import type {
9
9
  MessagePressableHandlerPayload,
10
10
  PressableHandlerPayload,
11
11
  } from '../../components/Message/Message';
12
+ import { DEFAULT_MESSAGE_OVERLAY_TARGET_ID } from '../../components/Message/messageOverlayConstants';
12
13
  import type { GroupType } from '../../components/MessageList/hooks/useMessageList';
13
14
  import type { ChannelContextValue } from '../../contexts/channelContext/ChannelContext';
14
15
  import type { MessageContentType } from '../../contexts/messagesContext/MessagesContext';
15
16
  import type { DeepPartial } from '../../contexts/themeContext/ThemeContext';
16
17
  import type { Theme } from '../../contexts/themeContext/utils/theme';
18
+ import type { Rect } from '../../state-store/message-overlay-store';
17
19
 
18
20
  import type { MessageComposerAPIContextValue } from '../messageComposerContext/MessageComposerAPIContext';
19
21
  import { DEFAULT_BASE_CONTEXT_VALUE } from '../utils/defaultBaseContextValue';
@@ -100,6 +102,12 @@ export type MessageContextValue = {
100
102
  onPressIn: ((payload: PressableHandlerPayload) => void) | null;
101
103
  /** The images attached to a message */
102
104
  otherAttachments: Attachment[];
105
+ /**
106
+ * Registers the subtree that should be measured and portaled into the message overlay.
107
+ * Custom message renderers typically interact with this via `MessageOverlayWrapper`.
108
+ */
109
+ registerMessageOverlayTarget: (params: { id: string; view: View | null }) => void;
110
+ unregisterMessageOverlayTarget: (id: string) => void;
103
111
  reactions: ReactionSummary[];
104
112
  /** Read count of the message */
105
113
  readBy: number | boolean;
@@ -164,3 +172,39 @@ export const useMessageContext = () => {
164
172
 
165
173
  return contextValue;
166
174
  };
175
+
176
+ type MessageOverlayRuntimeContextValue = {
177
+ overlayTargetRectRef: { current: Rect };
178
+ messageOverlayTargetId: string;
179
+ overlayActive: boolean;
180
+ };
181
+
182
+ const MessageOverlayRuntimeContext = React.createContext<MessageOverlayRuntimeContextValue>({
183
+ overlayTargetRectRef: { current: undefined },
184
+ messageOverlayTargetId: DEFAULT_MESSAGE_OVERLAY_TARGET_ID,
185
+ overlayActive: false,
186
+ });
187
+
188
+ export const MessageOverlayRuntimeProvider = ({
189
+ children,
190
+ value,
191
+ }: PropsWithChildren<{ value: MessageOverlayRuntimeContextValue }>) => (
192
+ <MessageOverlayRuntimeContext.Provider value={value}>
193
+ {children}
194
+ </MessageOverlayRuntimeContext.Provider>
195
+ );
196
+
197
+ export const useMessageOverlayRuntimeContext = () => useContext(MessageOverlayRuntimeContext);
198
+
199
+ const MessageOverlayTargetContext = React.createContext(false);
200
+
201
+ export const MessageOverlayTargetProvider = ({
202
+ children,
203
+ value,
204
+ }: PropsWithChildren<{ value: boolean }>) => (
205
+ <MessageOverlayTargetContext.Provider value={value}>
206
+ {children}
207
+ </MessageOverlayTargetContext.Provider>
208
+ );
209
+
210
+ export const useMessageOverlayTargetContext = () => useContext(MessageOverlayTargetContext);
@@ -75,6 +75,11 @@ export type MessagesContextValue = Pick<MessageContextValue, 'isMessageAIGenerat
75
75
  initialScrollToFirstUnreadMessage: boolean;
76
76
  /** Order to render the message content */
77
77
  messageContentOrder: MessageContentType[];
78
+ /**
79
+ * Overlay target id that should be teleported when a message overlay opens.
80
+ * Custom `MessageOverlayWrapper` usages should pass a matching `targetId`.
81
+ */
82
+ messageOverlayTargetId?: string;
78
83
  removeMessage: (message: { id: string; parent_id?: string }) => Promise<void>;
79
84
  /**
80
85
  * Override the api request for retry message functionality.
package/src/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "9.0.1-beta.2"
2
+ "version": "9.0.1-beta.3"
3
3
  }