@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.
- package/dist/{Card-BLl1Nu_E.js → Card-BB_Vd9Gj.js} +3 -3
- package/dist/{Card-BLl1Nu_E.js.map → Card-BB_Vd9Gj.js.map} +1 -1
- package/dist/{Card-Bcp-t2GU.cjs → Card-BbYTw4R8.cjs} +2 -2
- package/dist/{Card-Bcp-t2GU.cjs.map → Card-BbYTw4R8.cjs.map} +1 -1
- package/dist/{Card-CD2xIbPt.cjs → Card-CeWvHxmQ.cjs} +2 -2
- package/dist/{Card-CD2xIbPt.cjs.map → Card-CeWvHxmQ.cjs.map} +1 -1
- package/dist/{Card-CVgixEAH.js → Card-DJm5sWmC.js} +2 -2
- package/dist/{Card-CVgixEAH.js.map → Card-DJm5sWmC.js.map} +1 -1
- package/dist/{Card-DqdJoF3f.cjs → Card-DOMWuevV.cjs} +2 -2
- package/dist/{Card-DqdJoF3f.cjs.map → Card-DOMWuevV.cjs.map} +1 -1
- package/dist/{Card-Dn52lNZv.js → Card-b_mGrfMp.js} +2 -2
- package/dist/{Card-Dn52lNZv.js.map → Card-b_mGrfMp.js.map} +1 -1
- package/dist/{LockedThumbnail-KKhtrZWB.cjs → LockedThumbnail-AH9EZwQ1.cjs} +2 -2
- package/dist/{LockedThumbnail-KKhtrZWB.cjs.map → LockedThumbnail-AH9EZwQ1.cjs.map} +1 -1
- package/dist/{LockedThumbnail-BAOKNWWV.js → LockedThumbnail-C0LOfIvF.js} +2 -2
- package/dist/{LockedThumbnail-BAOKNWWV.js.map → LockedThumbnail-C0LOfIvF.js.map} +1 -1
- package/dist/{index-DaO2_oHM.js → index-C-2O97qw.js} +3 -3
- package/dist/index-C-2O97qw.js.map +1 -0
- package/dist/index-DdN7z-9Y.cjs +2 -0
- package/dist/index-DdN7z-9Y.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/src/providers/MessagingProvider.test.tsx +68 -0
- package/src/providers/MessagingProvider.tsx +12 -8
- package/dist/index-DaO2_oHM.js.map +0 -1
- package/dist/index-joaNq6Id.cjs +0 -2
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
//
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
|