@linktr.ee/messaging-react 3.7.0-rc-1783336702 → 3.7.0-rc-1783337316

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 (28) hide show
  1. package/dist/{Card-BLl1Nu_E.js → Card-BB_Vd9Gj.js} +3 -3
  2. package/dist/{Card-BLl1Nu_E.js.map → Card-BB_Vd9Gj.js.map} +1 -1
  3. package/dist/{Card-Bcp-t2GU.cjs → Card-BbYTw4R8.cjs} +2 -2
  4. package/dist/{Card-Bcp-t2GU.cjs.map → Card-BbYTw4R8.cjs.map} +1 -1
  5. package/dist/{Card-CD2xIbPt.cjs → Card-CeWvHxmQ.cjs} +2 -2
  6. package/dist/{Card-CD2xIbPt.cjs.map → Card-CeWvHxmQ.cjs.map} +1 -1
  7. package/dist/{Card-CVgixEAH.js → Card-DJm5sWmC.js} +2 -2
  8. package/dist/{Card-CVgixEAH.js.map → Card-DJm5sWmC.js.map} +1 -1
  9. package/dist/{Card-DqdJoF3f.cjs → Card-DOMWuevV.cjs} +2 -2
  10. package/dist/{Card-DqdJoF3f.cjs.map → Card-DOMWuevV.cjs.map} +1 -1
  11. package/dist/{Card-Dn52lNZv.js → Card-b_mGrfMp.js} +2 -2
  12. package/dist/{Card-Dn52lNZv.js.map → Card-b_mGrfMp.js.map} +1 -1
  13. package/dist/{LockedThumbnail-KKhtrZWB.cjs → LockedThumbnail-AH9EZwQ1.cjs} +2 -2
  14. package/dist/{LockedThumbnail-KKhtrZWB.cjs.map → LockedThumbnail-AH9EZwQ1.cjs.map} +1 -1
  15. package/dist/{LockedThumbnail-BAOKNWWV.js → LockedThumbnail-C0LOfIvF.js} +2 -2
  16. package/dist/{LockedThumbnail-BAOKNWWV.js.map → LockedThumbnail-C0LOfIvF.js.map} +1 -1
  17. package/dist/{index-DaO2_oHM.js → index-C-2O97qw.js} +3 -3
  18. package/dist/index-C-2O97qw.js.map +1 -0
  19. package/dist/index-DdN7z-9Y.cjs +2 -0
  20. package/dist/index-DdN7z-9Y.cjs.map +1 -0
  21. package/dist/index.cjs +1 -1
  22. package/dist/index.js +1 -1
  23. package/package.json +2 -2
  24. package/src/providers/MessagingProvider.test.tsx +68 -0
  25. package/src/providers/MessagingProvider.tsx +12 -8
  26. package/dist/index-DaO2_oHM.js.map +0 -1
  27. package/dist/index-joaNq6Id.cjs +0 -2
  28. package/dist/index-joaNq6Id.cjs.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-joaNq6Id.cjs");exports.ActionButton=e.ActionButton;exports.Avatar=e.Avatar;exports.ChannelEmptyState=e.ChannelEmptyState;exports.ChannelList=e.ChannelList;exports.ChannelView=e.ChannelView;exports.CustomMessageProvider=e.CustomMessageProvider;exports.FaqList=e.FaqList;exports.FaqListItem=e.FaqListItem;exports.LinkAttachment=e.LinkAttachment;exports.LockedAttachment=e.LockedAttachment;exports.MediaMessage=e.MediaMessage;exports.MessageAttachment=e.MessageAttachment;exports.MessageVoteButtons=e.MessageVoteButtons;exports.MessagingProvider=e.MessagingProvider;exports.MessagingShell=e.MessagingShell;exports.buildCompactMetaLabel=e.buildCompactMetaLabel;exports.formatFileSize=e.formatFileSize;exports.formatRelativeTime=e.formatRelativeTime;exports.getFileExtensionLabel=e.getFileExtensionLabel;exports.getMessageDisplayText=e.getMessageDisplayText;exports.isLinkAttachment=e.isLinkAttachment;exports.isUuidLike=e.isUuidLike;exports.messageAttachmentGroupPositionFromStream=e.bubbleGroupPositionFromStream;exports.normalizeLanguageCode=e.normalizeLanguageCode;exports.resolveConversationParticipant=e.resolveConversationParticipant;exports.resolveLinkAttachment=e.resolveLinkAttachment;exports.resolveMediaFromMessage=e.resolveMediaFromMessage;exports.resolveParticipantDisplayName=e.resolveParticipantDisplayName;exports.useComposerLocked=e.useComposerLocked;exports.useCustomMessage=e.useCustomMessage;exports.useMessageVote=e.useMessageVote;exports.useMessaging=e.useMessaging;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-DdN7z-9Y.cjs");exports.ActionButton=e.ActionButton;exports.Avatar=e.Avatar;exports.ChannelEmptyState=e.ChannelEmptyState;exports.ChannelList=e.ChannelList;exports.ChannelView=e.ChannelView;exports.CustomMessageProvider=e.CustomMessageProvider;exports.FaqList=e.FaqList;exports.FaqListItem=e.FaqListItem;exports.LinkAttachment=e.LinkAttachment;exports.LockedAttachment=e.LockedAttachment;exports.MediaMessage=e.MediaMessage;exports.MessageAttachment=e.MessageAttachment;exports.MessageVoteButtons=e.MessageVoteButtons;exports.MessagingProvider=e.MessagingProvider;exports.MessagingShell=e.MessagingShell;exports.buildCompactMetaLabel=e.buildCompactMetaLabel;exports.formatFileSize=e.formatFileSize;exports.formatRelativeTime=e.formatRelativeTime;exports.getFileExtensionLabel=e.getFileExtensionLabel;exports.getMessageDisplayText=e.getMessageDisplayText;exports.isLinkAttachment=e.isLinkAttachment;exports.isUuidLike=e.isUuidLike;exports.messageAttachmentGroupPositionFromStream=e.bubbleGroupPositionFromStream;exports.normalizeLanguageCode=e.normalizeLanguageCode;exports.resolveConversationParticipant=e.resolveConversationParticipant;exports.resolveLinkAttachment=e.resolveLinkAttachment;exports.resolveMediaFromMessage=e.resolveMediaFromMessage;exports.resolveParticipantDisplayName=e.resolveParticipantDisplayName;exports.useComposerLocked=e.useComposerLocked;exports.useCustomMessage=e.useCustomMessage;exports.useMessageVote=e.useMessageVote;exports.useMessaging=e.useMessaging;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { a as e, b as t, C as i, c as o, d as n, e as m, F as r, f as g, L as l, h as M, M as c, i as u, j as L, k as h, l as d, m as p, n as v, o as C, p as A, q as k, s as F, t as P, u as b, v as f, w as x, x as y, y as S, z as q, B as z, D as B, E as D, G as E } from "./index-DaO2_oHM.js";
1
+ import { a as e, b as t, C as i, c as o, d as n, e as m, F as r, f as g, L as l, h as M, M as c, i as u, j as L, k as h, l as d, m as p, n as v, o as C, p as A, q as k, s as F, t as P, u as b, v as f, w as x, x as y, y as S, z as q, B as z, D as B, E as D, G as E } from "./index-C-2O97qw.js";
2
2
  export {
3
3
  e as ActionButton,
4
4
  t as Avatar,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linktr.ee/messaging-react",
3
- "version": "3.7.0-rc-1783336702",
3
+ "version": "3.7.0-rc-1783337316",
4
4
  "description": "React messaging components built on messaging-core for web applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -50,7 +50,7 @@
50
50
  },
51
51
  "dependencies": {
52
52
  "@linktr.ee/component-library": "11.8.6",
53
- "@linktr.ee/messaging-core": "2.3.0-rc-1783336702",
53
+ "@linktr.ee/messaging-core": "2.3.0-rc-1783337316",
54
54
  "@phosphor-icons/react": "^2.1.10"
55
55
  },
56
56
  "devDependencies": {
@@ -418,4 +418,72 @@ describe('MessagingProvider', () => {
418
418
  expect.objectContaining({ id: 'user-2' })
419
419
  )
420
420
  })
421
+
422
+ it('clears apiKey client/connection state on injection so it cannot leak back to apiKey mode', async () => {
423
+ setupServiceMock()
424
+ const states: Array<{
425
+ isConnected: boolean
426
+ hasClient: boolean
427
+ error: string | null
428
+ }> = []
429
+ const apiKeyProps = {
430
+ apiKey: 'mock-api-key',
431
+ serviceConfig: {
432
+ fetchToken: async () => 'token',
433
+ createChannel: async () => ({ channelId: 'ch-1' }),
434
+ },
435
+ }
436
+ const onState = (s: unknown) =>
437
+ states.push(
438
+ s as { isConnected: boolean; hasClient: boolean; error: string | null }
439
+ )
440
+
441
+ const { rerender } = render(
442
+ <MessagingProvider
443
+ {...apiKeyProps}
444
+ user={{ id: 'user-1', name: 'User One' } as MessagingUser}
445
+ >
446
+ <Probe onState={onState} />
447
+ </MessagingProvider>
448
+ )
449
+
450
+ // apiKey path connects: client + isConnected become truthy.
451
+ await waitFor(() => {
452
+ const last = states[states.length - 1]
453
+ expect(last.isConnected).toBe(true)
454
+ expect(last.hasClient).toBe(true)
455
+ })
456
+
457
+ const injectedClient = {
458
+ userID: 'injected-user',
459
+ } as unknown as StreamChat
460
+ rerender(
461
+ <MessagingProvider
462
+ client={injectedClient}
463
+ user={{ id: 'user-1', name: 'User One' } as MessagingUser}
464
+ >
465
+ <Probe onState={onState} />
466
+ </MessagingProvider>
467
+ )
468
+ await act(async () => {
469
+ await Promise.resolve()
470
+ })
471
+
472
+ // Return to apiKey mode with no user, so nothing reconnects. The stale
473
+ // apiKey client/isConnected must have been cleared on injection, not
474
+ // resurface for MessagingShell to queryChannels against.
475
+ rerender(
476
+ <MessagingProvider {...apiKeyProps} user={null}>
477
+ <Probe onState={onState} />
478
+ </MessagingProvider>
479
+ )
480
+ await act(async () => {
481
+ await Promise.resolve()
482
+ })
483
+
484
+ const last = states[states.length - 1]
485
+ expect(last.isConnected).toBe(false)
486
+ expect(last.hasClient).toBe(false)
487
+ expect(last.error).toBeNull()
488
+ })
421
489
  })
@@ -162,15 +162,19 @@ export const MessagingProvider: React.FC<MessagingProviderProps> = ({
162
162
  const currentConfig = serviceConfigRef.current
163
163
 
164
164
  // An injected client owns its own connection — never create a service or
165
- // connect for it. Also drop any apiKey-path service left from a prior
166
- // connect: otherwise, if this instance later returns to apiKey mode, the
167
- // user-connection effect would see the stale service (before the new one is
168
- // installed) and connectUser on the previous backend.
165
+ // connect for it. Reset all apiKey-path connection state (service, client,
166
+ // isConnected, error, isLoading): while injected these are masked by the
167
+ // context, but on a later return to apiKey mode they would leak back —
168
+ // before the fresh service reconnects — feeding the user-connection effect
169
+ // a stale service and MessagingShell (which gates its load on
170
+ // `client && isConnected`) a disconnected client to queryChannels on.
169
171
  if (injectedClient) {
170
- if (serviceRef.current) {
171
- serviceRef.current = null
172
- setService(null)
173
- }
172
+ serviceRef.current = null
173
+ setService(null)
174
+ setClient(null)
175
+ setIsConnected(false)
176
+ setError(null)
177
+ setIsLoading(false)
174
178
  return
175
179
  }
176
180