Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit ed06ed0

Browse files
authored
Fix seekbar position for zero length audio (#9949)
1 parent 51b4555 commit ed06ed0

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

src/utils/numbers.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,6 @@ export function percentageWithin(pct: number, min: number, max: number): number
3838
}
3939

4040
export function percentageOf(val: number, min: number, max: number): number {
41-
return (val - min) / (max - min);
41+
const percentage = (val - min) / (max - min);
42+
return Number.isNaN(percentage) ? 0 : percentage;
4243
}

test/components/views/audio_messages/SeekBar-test.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,29 @@ describe("SeekBar", () => {
3434
frameRequestCallback = callback;
3535
return 0;
3636
});
37-
playback = createTestPlayback();
3837
});
3938

4039
afterEach(() => {
4140
mocked(window.requestAnimationFrame).mockRestore();
4241
});
4342

43+
describe("when rendering a SeekBar for an empty playback", () => {
44+
beforeEach(() => {
45+
playback = createTestPlayback({
46+
durationSeconds: 0,
47+
timeSeconds: 0,
48+
});
49+
renderResult = render(<SeekBar ref={seekBarRef} playback={playback} />);
50+
});
51+
52+
it("should render correctly", () => {
53+
expect(renderResult.container).toMatchSnapshot();
54+
});
55+
});
56+
4457
describe("when rendering a SeekBar", () => {
4558
beforeEach(() => {
59+
playback = createTestPlayback();
4660
renderResult = render(<SeekBar ref={seekBarRef} playback={playback} />);
4761
});
4862

test/components/views/audio_messages/__snapshots__/SeekBar-test.tsx.snap

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,21 @@ exports[`SeekBar when rendering a SeekBar and the playback proceeds should rende
1515
</div>
1616
`;
1717

18+
exports[`SeekBar when rendering a SeekBar for an empty playback should render correctly 1`] = `
19+
<div>
20+
<input
21+
class="mx_SeekBar"
22+
max="1"
23+
min="0"
24+
step="0.001"
25+
style="--fillTo: 0;"
26+
tabindex="0"
27+
type="range"
28+
value="0"
29+
/>
30+
</div>
31+
`;
32+
1833
exports[`SeekBar when rendering a SeekBar should render the initial position 1`] = `
1934
<div>
2035
<input

test/test-utils/audio.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { PlaybackClock } from "../../src/audio/PlaybackClock";
2222
import { UPDATE_EVENT } from "../../src/stores/AsyncStore";
2323
import { PublicInterface } from "../@types/common";
2424

25-
export const createTestPlayback = (): Playback => {
25+
export const createTestPlayback = (overrides: Partial<Playback> = {}): Playback => {
2626
const eventEmitter = new EventEmitter();
2727

2828
return {
@@ -63,6 +63,7 @@ export const createTestPlayback = (): Playback => {
6363
liveData: new SimpleObservable<number[]>(),
6464
durationSeconds: 31415,
6565
timeSeconds: 3141,
66+
...overrides,
6667
} as PublicInterface<Playback> as Playback;
6768
};
6869

test/utils/numbers-test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,9 @@ describe("numbers", () => {
160160
const result = percentageOf(14.28, 10.2, 20.4);
161161
expect(result).toBe(0.4);
162162
});
163+
164+
it("should return 0 for values that cause a division by zero", () => {
165+
expect(percentageOf(0, 0, 0)).toBe(0);
166+
});
163167
});
164168
});

0 commit comments

Comments
 (0)