@linktr.ee/messaging-react 4.0.0-rc-1786383858 → 4.0.0-rc-1786386505

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linktr.ee/messaging-react",
3
- "version": "4.0.0-rc-1786383858",
3
+ "version": "4.0.0-rc-1786386505",
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
  "chromatic:local": "yarn storybook:build && chromatic"
51
51
  },
52
52
  "dependencies": {
53
- "@linktr.ee/messaging-core": "2.4.0-rc-1786383858",
53
+ "@linktr.ee/messaging-core": "2.4.0-rc-1786386505",
54
54
  "@linktr.ee/messaging-taxonomy": "^0.9.0",
55
55
  "@phosphor-icons/react": "^2.1.10"
56
56
  },
@@ -1,6 +1,12 @@
1
1
  import { describe, expect, it, vi } from 'vitest'
2
2
 
3
- import { buildBroadcastsByOutboundId } from './BroadcastContext'
3
+ import { renderHook } from '../../test/utils'
4
+ import type { BroadcastResolver } from '../../types'
5
+
6
+ import {
7
+ buildBroadcastsByOutboundId,
8
+ useBroadcastsByOutboundId,
9
+ } from './BroadcastContext'
4
10
 
5
11
  describe('buildBroadcastsByOutboundId', () => {
6
12
  it('returns undefined when no resolver is provided', () => {
@@ -12,6 +18,16 @@ describe('buildBroadcastsByOutboundId', () => {
12
18
  ).toBeUndefined()
13
19
  })
14
20
 
21
+ it('returns undefined without invoking the resolver when there are no messages', () => {
22
+ const resolveBroadcast = vi.fn()
23
+
24
+ expect(
25
+ buildBroadcastsByOutboundId(undefined, resolveBroadcast)
26
+ ).toBeUndefined()
27
+ expect(buildBroadcastsByOutboundId([], resolveBroadcast)).toBeUndefined()
28
+ expect(resolveBroadcast).not.toHaveBeenCalled()
29
+ })
30
+
15
31
  it('resolves each unique outbound id once', () => {
16
32
  const resolveBroadcast = vi.fn((outboundId: string) => ({
17
33
  id: `broadcast-for-${outboundId}`,
@@ -50,3 +66,75 @@ describe('buildBroadcastsByOutboundId', () => {
50
66
  ).toBeUndefined()
51
67
  })
52
68
  })
69
+
70
+ describe('useBroadcastsByOutboundId', () => {
71
+ const messages = [{ metadata: { outbound_id: 'outbound-1' } }]
72
+
73
+ const renderWithResolver = (resolver: BroadcastResolver) =>
74
+ renderHook(
75
+ ({ resolveBroadcast }: { resolveBroadcast: BroadcastResolver }) =>
76
+ useBroadcastsByOutboundId(messages, resolveBroadcast),
77
+ { initialProps: { resolveBroadcast: resolver } }
78
+ )
79
+
80
+ it('publishes the new name when a broadcast is renamed under the same outbound id', () => {
81
+ const { result, rerender } = renderWithResolver(() => ({
82
+ id: 'broadcast-1',
83
+ name: 'July 9th Class absentee',
84
+ }))
85
+
86
+ expect(result.current).toEqual({
87
+ 'outbound-1': { id: 'broadcast-1', name: 'July 9th Class absentee' },
88
+ })
89
+
90
+ rerender({
91
+ resolveBroadcast: () => ({
92
+ id: 'broadcast-1',
93
+ name: 'July 9th Class waitlist',
94
+ }),
95
+ })
96
+
97
+ expect(result.current).toEqual({
98
+ 'outbound-1': { id: 'broadcast-1', name: 'July 9th Class waitlist' },
99
+ })
100
+ })
101
+
102
+ it('publishes the new broadcast id when an outbound record repoints to a same-named broadcast', () => {
103
+ const { result, rerender } = renderWithResolver(() => ({
104
+ id: 'broadcast-1',
105
+ name: 'July 9th Class absentee',
106
+ }))
107
+
108
+ expect(result.current).toEqual({
109
+ 'outbound-1': { id: 'broadcast-1', name: 'July 9th Class absentee' },
110
+ })
111
+
112
+ rerender({
113
+ resolveBroadcast: () => ({
114
+ id: 'broadcast-2',
115
+ name: 'July 9th Class absentee',
116
+ }),
117
+ })
118
+
119
+ expect(result.current).toEqual({
120
+ 'outbound-1': { id: 'broadcast-2', name: 'July 9th Class absentee' },
121
+ })
122
+ })
123
+
124
+ it('keeps the published map referentially stable when the resolved values are unchanged', () => {
125
+ const { result, rerender } = renderWithResolver(() => ({
126
+ id: 'broadcast-1',
127
+ name: 'July 9th Class absentee',
128
+ }))
129
+ const firstPublished = result.current
130
+
131
+ rerender({
132
+ resolveBroadcast: () => ({
133
+ id: 'broadcast-1',
134
+ name: 'July 9th Class absentee',
135
+ }),
136
+ })
137
+
138
+ expect(result.current).toBe(firstPublished)
139
+ })
140
+ })