11import { Component , cloneElement , Children } from 'react' ;
22import { h , noop } from '../util' ;
33
4+ export type TAudioEvent = ( event , Audio , IAudioState ) => void ;
5+
46export 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
1541export interface IAudioState {
16-
42+ isPlaying ?: boolean ;
1743}
1844
1945export 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 ) ,
0 commit comments