Skip to content

Commit acec82a

Browse files
committed
fix short audio drag to end issue
1 parent 69e3de1 commit acec82a

File tree

5 files changed

+31
-11
lines changed

5 files changed

+31
-11
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-h5-audio-player",
3-
"version": "3.9.1",
3+
"version": "3.9.3",
44
"description": "A customizable React audio player. Written in TypeScript. Mobile compatible. Keyboard friendly",
55
"main": "./lib/index.js",
66
"module": "./es/index.js",

src/ProgressBar.test.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ describe('ProgressBar', () => {
4747
get: jest.fn(() => audio.HAVE_ENOUGH_DATA),
4848
})
4949

50+
jest.spyOn(HTMLMediaElement.prototype, 'load').mockImplementation(() => {
51+
audio.currentTime = 0
52+
})
53+
5054
const mockMouseEvent = new MouseEvent(null)
5155
const mockSyntheticEvent = {
5256
nativeEvent: mockMouseEvent,
@@ -94,8 +98,7 @@ describe('ProgressBar', () => {
9498
instance.handleAudioTimeUpdate(mockSyntheticEvent)
9599
expect(wrapper.state('currentTimePos')).toBe('0%')
96100

97-
// Cover isFinite checking branch in handleWindowMouseOrTouchUp TODO: fix
98-
instance.timeOnMouseMove = NaN
101+
instance.timeOnMouseMove = 0
99102
instance.handleWindowMouseOrTouchUp(mockMouseEvent)
100103
expect(audio.currentTime).toBe(0)
101104

src/ProgressBar.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interface ProgressBarForwardRefProps {
99
showFilledProgress: boolean
1010
srcDuration?: number
1111
onSeek?: OnSeek
12-
onChangeCurrentTimeError?: () => void
12+
onChangeCurrentTimeError?: (err: Error) => void
1313
i18nProgressBar: string
1414
}
1515
interface ProgressBarProps extends ProgressBarForwardRefProps {
@@ -140,11 +140,15 @@ class ProgressBar extends Component<ProgressBarProps, ProgressBarState> {
140140
isDraggingProgress: false,
141141
}
142142
if (audio.readyState === audio.HAVE_NOTHING || audio.readyState === audio.HAVE_METADATA || !isFinite(newTime)) {
143-
newProps.currentTimePos = '0%'
144-
onChangeCurrentTimeError && onChangeCurrentTimeError()
145-
} else {
146-
audio.currentTime = newTime
143+
try {
144+
audio.load()
145+
} catch (err) {
146+
newProps.currentTimePos = '0%'
147+
return onChangeCurrentTimeError && onChangeCurrentTimeError(err as Error)
148+
}
147149
}
150+
151+
audio.currentTime = newTime
148152
this.setState(newProps)
149153
}
150154

src/index.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ interface PlayerProps {
7676
onClickPrevious?: (e: React.SyntheticEvent) => void
7777
onClickNext?: (e: React.SyntheticEvent) => void
7878
onPlayError?: (err: Error) => void
79-
onChangeCurrentTimeError?: () => void
79+
onChangeCurrentTimeError?: (err: Error) => void
8080
mse?: MSEPropsObject
8181
/**
8282
* HTML5 Audio tag preload property
@@ -217,6 +217,9 @@ class H5AudioPlayer extends Component<PlayerProps> {
217217
* Reference: https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
218218
*/
219219
playAudioPromise = (): void => {
220+
if (this.audio.current.error) {
221+
this.audio.current.load()
222+
}
220223
const playPromise = this.audio.current.play()
221224
// playPromise is null in IE 11
222225
if (playPromise) {
@@ -299,7 +302,11 @@ class H5AudioPlayer extends Component<PlayerProps> {
299302
!isFinite(duration) ||
300303
!isFinite(prevTime)
301304
) {
302-
return this.props.onChangeCurrentTimeError && this.props.onChangeCurrentTimeError()
305+
try {
306+
audio.load()
307+
} catch (err) {
308+
return this.props.onChangeCurrentTimeError && this.props.onChangeCurrentTimeError(err as Error)
309+
}
303310
}
304311
let currentTime = prevTime + time / 1000
305312
if (currentTime < 0) {
@@ -573,6 +580,11 @@ class H5AudioPlayer extends Component<PlayerProps> {
573580
}
574581

575582
audio.addEventListener('error', (e) => {
583+
const target = e.target as HTMLAudioElement
584+
// Calls onEnded when currentTime is the same as duration even if there is an error
585+
if (target.error && target.currentTime === target.duration) {
586+
return this.props.onEnded && this.props.onEnded(e)
587+
}
576588
this.props.onError && this.props.onError(e)
577589
})
578590

stories/actions.stories.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@ Go to `Canvas` tab to see `Actions` logger
2929
onVolumeChange={action('onVolumeChange')}
3030
onPause={action('onPause')}
3131
onPlay={action('onPlay')}
32+
onChangeCurrentTimeError={action('onChangeCurrentTimeError')}
3233
onClickPrevious={action('onClickPrevious')}
3334
onClickNext={action('onClickNext')}
3435
volume={0.8}
3536
showSkipControls
3637
progressUpdateInterval={100}
37-
src={SAMPLE_MP3_URL}
38+
src="https://assets.alllq.in/prod/AQ/content/audios/EnglishFluency/U1/A5/6-3-te.mp3"
3839
/>
3940
</Story>
4041
</Preview>

0 commit comments

Comments
 (0)