Skip to content

Commit 41888f9

Browse files
committed
feat: add <Audio> events
1 parent 6ef2e6e commit 41888f9

File tree

2 files changed

+94
-6
lines changed

2 files changed

+94
-6
lines changed

src/Audio/index.ts

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import {Component, cloneElement, Children} from 'react';
22
import {h, noop} from '../util';
33

4+
export type TAudioEvent = (event, Audio, IAudioState) => void;
5+
46
export interface IAudioProps {
57
src: string;
68
children?: (...args) => React.ReactElement<any>;
@@ -10,15 +12,43 @@ export interface IAudioProps {
1012
preload?: 'none' | 'metadata' | 'auto';
1113
volume?: number;
1214
renderInner?: () => React.ReactElement<any>;
15+
16+
onAbort?: TAudioEvent,
17+
onCanPlay?: TAudioEvent,
18+
onCanPlayThrough?: TAudioEvent,
19+
onDurationChange?: TAudioEvent,
20+
onEmptied?: TAudioEvent,
21+
onEncrypted?: TAudioEvent,
22+
onEnded?: TAudioEvent,
23+
onError?: TAudioEvent,
24+
onLoadedData?: TAudioEvent,
25+
onLoadedMetadata?: TAudioEvent,
26+
onLoadStart?: TAudioEvent,
27+
onPause?: TAudioEvent,
28+
onPlay?: TAudioEvent,
29+
onPlaying?: TAudioEvent,
30+
onProgress?: TAudioEvent,
31+
onRateChange?: TAudioEvent,
32+
onSeeked?: TAudioEvent,
33+
onSeeking?: TAudioEvent,
34+
onStalled?: TAudioEvent,
35+
onSuspend?: TAudioEvent,
36+
onTimeUpdate?: TAudioEvent,
37+
onVolumeChange?: TAudioEvent,
38+
onWaiting?: TAudioEvent
1339
}
1440

1541
export interface IAudioState {
16-
42+
isPlaying?: boolean;
1743
}
1844

1945
export class Audio extends Component<IAudioProps, IAudioState> {
2046
el: HTMLAudioElement;
2147

48+
state: IAudioState = {
49+
isPlaying: false
50+
};
51+
2252
ref = (el) => {
2353
this.el = el;
2454
};
@@ -41,8 +71,22 @@ export class Audio extends Component<IAudioProps, IAudioState> {
4171
}
4272
};
4373

74+
event = (name: string) => (event) => {
75+
const handler = this.props[name];
76+
77+
if (handler) {
78+
handler(event, this, this.state);
79+
}
80+
81+
this.scrapDOM();
82+
};
83+
84+
scrapDOM() {
85+
86+
}
87+
4488
render () {
45-
const {props} = this;
89+
const {props, event} = this;
4690
const {children, src, autoplay, loop, muted, preload, volume, renderInner = noop as any} = props;
4791

4892

@@ -53,12 +97,35 @@ export class Audio extends Component<IAudioProps, IAudioState> {
5397
loop,
5498
muted,
5599
preload,
56-
volume
100+
volume,
101+
onAbort: event('onAbort'),
102+
onCanPlay: event('onCanPlay'),
103+
onCanPlayThrough: event('onCanPlayThrough'),
104+
onDurationChange: event('onDurationChange'),
105+
onEmptied: event('onEmptied'),
106+
onEncrypted: event('onEncrypted'),
107+
onEnded: event('onEnded'),
108+
onError: event('onError'),
109+
onLoadedData: event('onLoadedData'),
110+
onLoadedMetadata: event('onLoadedMetadata'),
111+
onLoadStart: event('onLoadStart'),
112+
onPause: event('onPause'),
113+
onPlay: event('onPlay'),
114+
onPlaying: event('onPlaying'),
115+
onProgress: event('onProgress'),
116+
onRateChange: event('onRateChange'),
117+
onSeeked: event('onSeeked'),
118+
onSeeking: event('onSeeking'),
119+
onStalled: event('onStalled'),
120+
onSuspend: event('onSuspend'),
121+
onTimeUpdate: event('onTimeUpdate'),
122+
onVolumeChange: event('onVolumeChange'),
123+
onWaiting: event('onWaiting')
57124
},
58125
renderInner()
59126
);
60127

61-
const markup = children(this);
128+
const markup = children(this, this.state);
62129

63130
return cloneElement(markup, null, ...[
64131
...Children.toArray(markup.props.children),

src/Audio/story.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,32 @@ import {action} from '@storybook/addon-actions';
44
import {linkTo} from '@storybook/addon-links';
55
import {Audio} from '.';
66

7+
const src = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3';
8+
79
storiesOf('Generators/Audio', module)
8-
.add('basic', () =>
9-
<Audio autoplay src='https://html5tutorial.info/media/vincent.mp3'>{(audio) =>
10+
.add('Example', () =>
11+
<Audio autoplay src={src}>{(audio) =>
1012
<div>
1113
Hello audio!
1214
</div>
1315
}</Audio>
16+
)
17+
.add('With controls', () =>
18+
<Audio src={src}>{({play, pause}) =>
19+
<div>
20+
<button onClick={play}>Play</button>
21+
<button onClick={pause}>Pause</button>
22+
</div>
23+
}</Audio>
24+
)
25+
.add('Show state', () =>
26+
<Audio src={src}>{(audio, state) =>
27+
<div>
28+
<button onClick={audio.play}>Play</button>
29+
<button onClick={audio.pause}>Pause</button>
30+
<pre style={{fontFamily: 'monospace'}}>
31+
{JSON.stringify(state, null, 4)}
32+
</pre>
33+
</div>
34+
}</Audio>
1435
);

0 commit comments

Comments
 (0)