stream-chat-react-native-core 9.10.0 → 9.10.1-beta.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 (52) hide show
  1. package/lib/commonjs/components/UIComponents/PortalWhileClosingView.js +8 -5
  2. package/lib/commonjs/components/UIComponents/PortalWhileClosingView.js.map +1 -1
  3. package/lib/commonjs/contexts/overlayContext/ClosingPortalHostsLayer.js +8 -4
  4. package/lib/commonjs/contexts/overlayContext/ClosingPortalHostsLayer.js.map +1 -1
  5. package/lib/commonjs/contexts/overlayContext/MessageOverlayHostLayer.js +25 -11
  6. package/lib/commonjs/contexts/overlayContext/MessageOverlayHostLayer.js.map +1 -1
  7. package/lib/commonjs/contexts/overlayContext/OverlayHostLayerContext.js +10 -0
  8. package/lib/commonjs/contexts/overlayContext/OverlayHostLayerContext.js.map +1 -0
  9. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js +16 -6
  10. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js.map +1 -1
  11. package/lib/commonjs/state-store/message-overlay-store.js +47 -18
  12. package/lib/commonjs/state-store/message-overlay-store.js.map +1 -1
  13. package/lib/commonjs/version.json +1 -1
  14. package/lib/module/components/UIComponents/PortalWhileClosingView.js +8 -5
  15. package/lib/module/components/UIComponents/PortalWhileClosingView.js.map +1 -1
  16. package/lib/module/contexts/overlayContext/ClosingPortalHostsLayer.js +8 -4
  17. package/lib/module/contexts/overlayContext/ClosingPortalHostsLayer.js.map +1 -1
  18. package/lib/module/contexts/overlayContext/MessageOverlayHostLayer.js +25 -11
  19. package/lib/module/contexts/overlayContext/MessageOverlayHostLayer.js.map +1 -1
  20. package/lib/module/contexts/overlayContext/OverlayHostLayerContext.js +10 -0
  21. package/lib/module/contexts/overlayContext/OverlayHostLayerContext.js.map +1 -0
  22. package/lib/module/contexts/overlayContext/OverlayProvider.js +16 -6
  23. package/lib/module/contexts/overlayContext/OverlayProvider.js.map +1 -1
  24. package/lib/module/state-store/message-overlay-store.js +47 -18
  25. package/lib/module/state-store/message-overlay-store.js.map +1 -1
  26. package/lib/module/version.json +1 -1
  27. package/lib/typescript/components/UIComponents/PortalWhileClosingView.d.ts.map +1 -1
  28. package/lib/typescript/contexts/overlayContext/ClosingPortalHostsLayer.d.ts +10 -1
  29. package/lib/typescript/contexts/overlayContext/ClosingPortalHostsLayer.d.ts.map +1 -1
  30. package/lib/typescript/contexts/overlayContext/MessageOverlayHostLayer.d.ts +9 -1
  31. package/lib/typescript/contexts/overlayContext/MessageOverlayHostLayer.d.ts.map +1 -1
  32. package/lib/typescript/contexts/overlayContext/OverlayHostLayerContext.d.ts +8 -0
  33. package/lib/typescript/contexts/overlayContext/OverlayHostLayerContext.d.ts.map +1 -0
  34. package/lib/typescript/contexts/overlayContext/OverlayProvider.d.ts.map +1 -1
  35. package/lib/typescript/state-store/message-overlay-store.d.ts +16 -0
  36. package/lib/typescript/state-store/message-overlay-store.d.ts.map +1 -1
  37. package/package.json +14 -14
  38. package/src/components/MessageInput/__tests__/__snapshots__/AttachButton.test.tsx.snap +1809 -1704
  39. package/src/components/MessageInput/__tests__/__snapshots__/SendButton.test.tsx.snap +1208 -1138
  40. package/src/components/MessageList/__tests__/__snapshots__/ScrollToBottomButton.test.tsx.snap +128 -121
  41. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +722 -680
  42. package/src/components/UIComponents/PortalWhileClosingView.tsx +15 -4
  43. package/src/components/UIComponents/__tests__/PortalWhileClosingView.test.tsx +38 -0
  44. package/src/contexts/overlayContext/ClosingPortalHostsLayer.tsx +18 -2
  45. package/src/contexts/overlayContext/MessageOverlayHostLayer.tsx +47 -16
  46. package/src/contexts/overlayContext/OverlayHostLayerContext.ts +9 -0
  47. package/src/contexts/overlayContext/OverlayProvider.tsx +12 -7
  48. package/src/contexts/overlayContext/__tests__/ClosingPortalHostsLayer.test.tsx +27 -0
  49. package/src/contexts/overlayContext/__tests__/MessageOverlayHostLayer.test.tsx +84 -6
  50. package/src/state-store/__tests__/message-overlay-store.test.tsx +97 -0
  51. package/src/state-store/message-overlay-store.ts +70 -11
  52. package/src/version.json +1 -1
@@ -51,37 +51,43 @@ type OverlaySharedValueController = {
51
51
  setTopH: (rect: Rect) => void;
52
52
  };
53
53
 
54
- let sharedValueController: OverlaySharedValueController | undefined;
54
+ // Every mounted `MessageOverlayHostLayer` registers its controller and the most recently registered
55
+ // one drives the overlay. Unregistering hands control back to the previous controller, so nested
56
+ // `OverlayProvider`s (one at the root and one inside a native modal, for example) can come and go.
57
+ let sharedValueControllerStack: OverlaySharedValueController[] = [];
58
+
59
+ const getSharedValueController = () =>
60
+ sharedValueControllerStack[sharedValueControllerStack.length - 1];
55
61
 
56
62
  export const registerOverlaySharedValueController = (controller: OverlaySharedValueController) => {
57
- sharedValueController = controller;
63
+ sharedValueControllerStack = [...sharedValueControllerStack, controller];
58
64
  return () => {
59
- if (sharedValueController === controller) {
60
- sharedValueController = undefined;
61
- }
65
+ sharedValueControllerStack = sharedValueControllerStack.filter(
66
+ (registeredController) => registeredController !== controller,
67
+ );
62
68
  };
63
69
  };
64
70
 
65
71
  export const setOverlayMessageH = (messageH: Rect) => {
66
- sharedValueController?.setMessageH(messageH);
72
+ getSharedValueController()?.setMessageH(messageH);
67
73
  };
68
74
 
69
75
  export const setOverlayTopH = (topH: Rect) => {
70
- sharedValueController?.setTopH(topH);
76
+ getSharedValueController()?.setTopH(topH);
71
77
  };
72
78
 
73
79
  export const setOverlayBottomH = (bottomH: Rect) => {
74
- sharedValueController?.setBottomH(bottomH);
80
+ getSharedValueController()?.setBottomH(bottomH);
75
81
  };
76
82
 
77
83
  export const bumpOverlayLayoutRevision = (closeCorrectionDeltaY = 0) => {
78
- sharedValueController?.incrementCloseCorrectionY(closeCorrectionDeltaY);
84
+ getSharedValueController()?.incrementCloseCorrectionY(closeCorrectionDeltaY);
79
85
  };
80
86
 
81
87
  export const openOverlay = (params: OpenOverlayParams | string) => {
82
88
  const overlayPayload = typeof params === 'string' ? { id: params, messageId: undefined } : params;
83
89
 
84
- sharedValueController?.resetCloseCorrectionY();
90
+ getSharedValueController()?.resetCloseCorrectionY();
85
91
  overlayStore.partialNext({
86
92
  closing: false,
87
93
  closingPortalHostBlacklist: getCurrentClosingPortalHostBlacklist(),
@@ -122,7 +128,7 @@ export const finalizeCloseOverlay = () => {
122
128
  ...DefaultState,
123
129
  closingPortalHostBlacklist: getCurrentClosingPortalHostBlacklist(),
124
130
  });
125
- sharedValueController?.reset();
131
+ getSharedValueController()?.reset();
126
132
  };
127
133
 
128
134
  export const overlayStore = new StateStore<OverlayState>(DefaultState);
@@ -133,6 +139,59 @@ const closingPortalLayoutsStore = new StateStore<ClosingPortalLayoutsState>(
133
139
  export const createClosingPortalLayoutRegistrationId = () =>
134
140
  `closing-portal-layout-${closingPortalLayoutRegistrationCounter++}`;
135
141
 
142
+ type OverlayHostLayersState = {
143
+ hostLayerIds: string[];
144
+ };
145
+
146
+ let overlayHostLayerRegistrationCounter = 0;
147
+
148
+ const overlayHostLayersStore = new StateStore<OverlayHostLayersState>({ hostLayerIds: [] });
149
+
150
+ export const createOverlayHostLayerId = () =>
151
+ `overlay-host-layer-${overlayHostLayerRegistrationCounter++}`;
152
+
153
+ /**
154
+ * Registers a `MessageOverlayHostLayer` (one per `OverlayProvider`) using stack semantics.
155
+ *
156
+ * Only the most recently registered layer drives the overlay and owns the shared portal host names.
157
+ * Portal hosts are looked up by name in a single native registry, so two layers using the same
158
+ * names would take them over from each other. The other layers park their hosts under names unique
159
+ * to them, and when the top layer unregisters the previous one takes the shared names back.
160
+ */
161
+ export const registerOverlayHostLayer = (id: string) => {
162
+ overlayHostLayersStore.partialNext({
163
+ hostLayerIds: [...overlayHostLayersStore.getLatestValue().hostLayerIds, id],
164
+ });
165
+
166
+ return () => {
167
+ overlayHostLayersStore.partialNext({
168
+ hostLayerIds: overlayHostLayersStore
169
+ .getLatestValue()
170
+ .hostLayerIds.filter((hostLayerId) => hostLayerId !== id),
171
+ });
172
+ };
173
+ };
174
+
175
+ const topOverlayHostLayer = { isTop: true };
176
+ const notTopOverlayHostLayer = { isTop: false };
177
+
178
+ /**
179
+ * Whether the host layer with the given id is the one that currently owns the overlay. A missing
180
+ * id (used outside of an `OverlayProvider`) or an empty stack counts as the top, which keeps the
181
+ * single provider setup identical to before the stack existed.
182
+ */
183
+ export const useIsTopOverlayHostLayer = (id: string | undefined) => {
184
+ const isTopOverlayHostLayerSelector = useCallback(
185
+ ({ hostLayerIds }: OverlayHostLayersState) =>
186
+ !id || !hostLayerIds.length || hostLayerIds[hostLayerIds.length - 1] === id
187
+ ? topOverlayHostLayer
188
+ : notTopOverlayHostLayer,
189
+ [id],
190
+ );
191
+
192
+ return useStateStore(overlayHostLayersStore, isTopOverlayHostLayerSelector).isTop;
193
+ };
194
+
136
195
  const getCurrentClosingPortalHostBlacklist = () =>
137
196
  closingPortalHostBlacklistStack[closingPortalHostBlacklistStack.length - 1]?.hostNames ?? [];
138
197
 
package/src/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "9.10.0"
2
+ "version": "9.10.1-beta.2"
3
3
  }