@@ -11,7 +11,7 @@ export interface IAudioProps {
11
11
muted ?: boolean ;
12
12
preload ?: 'none' | 'metadata' | 'auto' ;
13
13
volume ?: number ;
14
- renderInner ?: ( ) => React . ReactElement < any > ;
14
+ noJs ?: React . ReactElement < any > ;
15
15
16
16
onAbort ?: TAudioEvent ,
17
17
onCanPlay ?: TAudioEvent ,
@@ -39,24 +39,38 @@ export interface IAudioProps {
39
39
}
40
40
41
41
export interface IAudioState {
42
+ time ?: number ;
43
+ duration ?: number ;
42
44
isPlaying ?: boolean ;
45
+ volume : number ;
43
46
}
44
47
45
48
export class Audio extends Component < IAudioProps , IAudioState > {
46
- el : HTMLAudioElement ;
49
+ el : HTMLAudioElement = null ;
47
50
48
51
state : IAudioState = {
49
- isPlaying : false
52
+ time : 0 ,
53
+ duration : 0 ,
54
+ isPlaying : false ,
55
+ volume : NaN
50
56
} ;
51
57
52
58
ref = ( el ) => {
53
59
this . el = el ;
54
60
} ;
55
61
56
- componentDidMount ( ) {
62
+ componentDidMount ( ) {
57
63
if ( this . props . autoplay && this . el . paused ) {
58
64
this . play ( ) ;
59
65
}
66
+
67
+ this . setState ( {
68
+ volume : this . el . volume
69
+ } ) ;
70
+ }
71
+
72
+ componentWillUnmount ( ) {
73
+ this . el = null ;
60
74
}
61
75
62
76
play = ( ) => {
@@ -71,27 +85,80 @@ export class Audio extends Component<IAudioProps, IAudioState> {
71
85
}
72
86
} ;
73
87
88
+ seek = ( time : number ) => {
89
+ if ( this . el ) {
90
+ time = Math . min ( this . state . duration , Math . max ( 0 , time ) ) ;
91
+ this . el . currentTime = time ;
92
+ }
93
+ } ;
94
+
95
+ volume = ( volume ) => {
96
+ if ( this . el ) {
97
+ volume = Math . min ( 1 , Math . max ( 0 , volume ) ) ;
98
+
99
+ this . el . volume = volume ;
100
+ this . setState ( {
101
+ volume
102
+ } ) ;
103
+ }
104
+ } ;
105
+
74
106
event = ( name : string ) => ( event ) => {
75
107
const handler = this . props [ name ] ;
76
108
77
109
if ( handler ) {
78
110
handler ( event , this , this . state ) ;
79
111
}
112
+ } ;
80
113
81
- this . scrapDOM ( ) ;
114
+ onPlay = ( event ) => {
115
+ this . setState ( {
116
+ isPlaying : true
117
+ } ) ;
118
+
119
+ this . event ( 'onPlay' ) ( event ) ;
82
120
} ;
83
121
84
- scrapDOM ( ) {
122
+ onPause = ( event ) => {
123
+ this . setState ( {
124
+ isPlaying : false
125
+ } ) ;
85
126
86
- }
127
+ this . event ( 'onPause' ) ( event ) ;
128
+ } ;
129
+
130
+ onVolumeChange = ( event ) => {
131
+ this . setState ( {
132
+ volume : this . el . volume
133
+ } ) ;
134
+
135
+ this . event ( 'onVolumeChange' ) ( event ) ;
136
+ } ;
137
+
138
+ onDurationChange = ( event ) => {
139
+ this . setState ( {
140
+ duration : this . el . duration
141
+ } ) ;
142
+
143
+ this . event ( 'onDurationChange' ) ( event ) ;
144
+ } ;
145
+
146
+ onTimeUpdate = ( event ) => {
147
+ this . setState ( {
148
+ time : this . el . currentTime
149
+ } ) ;
150
+
151
+ this . event ( 'onTimeUpdate' ) ( event ) ;
152
+ } ;
87
153
88
154
render ( ) {
89
155
const { props, event} = this ;
90
- const { children, src, autoplay, loop, muted, preload, volume, renderInner = noop as any } = props ;
156
+ const { children, src, autoplay, loop, muted, preload, volume, noJs = noop as any } = props ;
91
157
92
158
93
159
const audio = h ( 'audio' , {
94
160
ref : this . ref ,
161
+ controls : false ,
95
162
src,
96
163
autoplay,
97
164
loop,
@@ -101,28 +168,28 @@ export class Audio extends Component<IAudioProps, IAudioState> {
101
168
onAbort : event ( 'onAbort' ) ,
102
169
onCanPlay : event ( 'onCanPlay' ) ,
103
170
onCanPlayThrough : event ( 'onCanPlayThrough' ) ,
104
- onDurationChange : event ( ' onDurationChange' ) ,
171
+ onDurationChange : this . onDurationChange ,
105
172
onEmptied : event ( 'onEmptied' ) ,
106
173
onEncrypted : event ( 'onEncrypted' ) ,
107
174
onEnded : event ( 'onEnded' ) ,
108
175
onError : event ( 'onError' ) ,
109
176
onLoadedData : event ( 'onLoadedData' ) ,
110
177
onLoadedMetadata : event ( 'onLoadedMetadata' ) ,
111
178
onLoadStart : event ( 'onLoadStart' ) ,
112
- onPause : event ( ' onPause' ) ,
113
- onPlay : event ( ' onPlay' ) ,
179
+ onPause : this . onPause ,
180
+ onPlay : this . onPlay ,
114
181
onPlaying : event ( 'onPlaying' ) ,
115
182
onProgress : event ( 'onProgress' ) ,
116
183
onRateChange : event ( 'onRateChange' ) ,
117
184
onSeeked : event ( 'onSeeked' ) ,
118
185
onSeeking : event ( 'onSeeking' ) ,
119
186
onStalled : event ( 'onStalled' ) ,
120
187
onSuspend : event ( 'onSuspend' ) ,
121
- onTimeUpdate : event ( ' onTimeUpdate' ) ,
122
- onVolumeChange : event ( ' onVolumeChange' ) ,
188
+ onTimeUpdate : this . onTimeUpdate ,
189
+ onVolumeChange : this . onVolumeChange ,
123
190
onWaiting : event ( 'onWaiting' )
124
191
} ,
125
- renderInner ( )
192
+ noJs
126
193
) ;
127
194
128
195
const markup = children ( this , this . state ) ;
0 commit comments