Skip to content

Commit 623a9ed

Browse files
authored
refactor(live-region-element): update message order for assertive messages (#45)
* refactor(live-region-element): update message order for assertive messages * chore: add changeset * Update pink-cups-battle.md
1 parent dcaed7a commit 623a9ed

File tree

3 files changed

+157
-8
lines changed

3 files changed

+157
-8
lines changed

.changeset/pink-cups-battle.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@primer/live-region-element": patch
3+
---
4+
5+
Update ordering of announcements to prioritize assertive announcements over polite if they are scheduled before or at the same time

packages/live-region-element/src/__tests__/live-region-element.test.ts

+112-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {afterEach, beforeEach, describe, test, expect} from 'vitest'
2-
import {LiveRegionElement} from '../live-region-element'
2+
import {LiveRegionElement, compareMessages} from '../live-region-element'
3+
import {Ordering} from '../order'
34
import '../define'
45

56
describe('live-region-element', () => {
@@ -48,4 +49,114 @@ describe('live-region-element', () => {
4849
expect(liveRegion.getMessage('polite')).toBe('')
4950
expect(liveRegion.getMessage('assertive')).toBe('test')
5051
})
52+
53+
describe('compareMessages', () => {
54+
test('messages with same politeness, a scheduled at same time as b', () => {
55+
const now = Date.now()
56+
expect(
57+
compareMessages(
58+
{
59+
contents: 'test',
60+
politeness: 'polite',
61+
scheduled: now,
62+
},
63+
{
64+
contents: 'test',
65+
politeness: 'polite',
66+
scheduled: now,
67+
},
68+
),
69+
).toBe(Ordering.Equal)
70+
})
71+
72+
test('messages with same politeness, a scheduled before b', () => {
73+
const now = Date.now()
74+
expect(
75+
compareMessages(
76+
{
77+
contents: 'test',
78+
politeness: 'polite',
79+
scheduled: now,
80+
},
81+
{
82+
contents: 'test',
83+
politeness: 'polite',
84+
scheduled: now + 1000,
85+
},
86+
),
87+
).toBe(Ordering.Less)
88+
})
89+
90+
test('messages with same politeness, a scheduled after b', () => {
91+
const now = Date.now()
92+
expect(
93+
compareMessages(
94+
{
95+
contents: 'test',
96+
politeness: 'polite',
97+
scheduled: now + 1000,
98+
},
99+
{
100+
contents: 'test',
101+
politeness: 'polite',
102+
scheduled: now,
103+
},
104+
),
105+
).toBe(Ordering.Greater)
106+
})
107+
108+
test('messages with different politeness, a scheduled at same time as b', () => {
109+
const now = Date.now()
110+
expect(
111+
compareMessages(
112+
{
113+
contents: 'test',
114+
politeness: 'assertive',
115+
scheduled: now,
116+
},
117+
{
118+
contents: 'test',
119+
politeness: 'polite',
120+
scheduled: now,
121+
},
122+
),
123+
).toBe(Ordering.Less)
124+
})
125+
126+
test('messages with different politeness, a scheduled before b', () => {
127+
const now = Date.now()
128+
expect(
129+
compareMessages(
130+
{
131+
contents: 'test',
132+
politeness: 'assertive',
133+
scheduled: now,
134+
},
135+
{
136+
contents: 'test',
137+
politeness: 'polite',
138+
scheduled: now + 1000,
139+
},
140+
),
141+
).toBe(Ordering.Less)
142+
})
143+
144+
test('messages with different politeness, a scheduled after b', () => {
145+
const now = Date.now()
146+
expect(
147+
compareMessages(
148+
{
149+
contents: 'test',
150+
politeness: 'assertive',
151+
scheduled: now + 1000,
152+
},
153+
{
154+
contents: 'test',
155+
politeness: 'polite',
156+
scheduled: now,
157+
},
158+
),
159+
).toBe(Ordering.Greater)
160+
})
161+
})
51162
})

packages/live-region-element/src/live-region-element.ts

+40-7
Original file line numberDiff line numberDiff line change
@@ -247,18 +247,51 @@ function getTemplate() {
247247
return template
248248
}
249249

250-
function compareMessages(a: Message, b: Message): Order {
251-
if (a.scheduled === b.scheduled) {
252-
return Ordering.Equal
250+
export function compareMessages(a: Message, b: Message): Order {
251+
if (a.politeness === b.politeness) {
252+
if (a.scheduled === b.scheduled) {
253+
return Ordering.Equal
254+
}
255+
256+
// Schedule a before b
257+
if (a.scheduled < b.scheduled) {
258+
return Ordering.Less
259+
}
260+
261+
// Schedule a after b
262+
return Ordering.Greater
263+
}
264+
265+
// Only prioritize assertive messages if they are scheduled at the same time,
266+
// or before
267+
if (a.politeness === 'assertive' && b.politeness !== 'assertive') {
268+
if (a.scheduled === b.scheduled) {
269+
return Ordering.Less
270+
}
271+
272+
if (a.scheduled < b.scheduled) {
273+
return Ordering.Less
274+
}
275+
276+
return Ordering.Greater
253277
}
254278

255-
// Schedule a before b
256-
if (a.scheduled < b.scheduled) {
279+
if (a.politeness !== 'assertive' && b.politeness === 'assertive') {
280+
// Schedule a after b
281+
if (a.scheduled === b.scheduled) {
282+
return Ordering.Greater
283+
}
284+
285+
// Schedule a after b
286+
if (a.scheduled > b.scheduled) {
287+
return Ordering.Greater
288+
}
289+
290+
// Schedule a before b
257291
return Ordering.Less
258292
}
259293

260-
// Schedule a after b
261-
return Ordering.Greater
294+
return Ordering.Equal
262295
}
263296

264297
function noop() {}

0 commit comments

Comments
 (0)