@@ -26,7 +26,6 @@ import SeekBarExpander from './SeekBarExpander';
26
26
import SeekBar from './SeekBar' ;
27
27
28
28
interface IState {
29
- sliderWidth : number ;
30
29
userInteracting : boolean ;
31
30
}
32
31
@@ -106,8 +105,10 @@ const Div = styled.div`
106
105
class Progress extends Component < ISeekBarSlider , IState > {
107
106
static contextType = MediaContext ;
108
107
108
+ sliderPosition = 0 ;
109
+ sliderWidth = 0 ;
110
+
109
111
readonly state = {
110
- sliderWidth : 0 ,
111
112
userInteracting : false
112
113
} ;
113
114
@@ -179,17 +180,18 @@ class Progress extends Component<ISeekBarSlider, IState> {
179
180
}
180
181
181
182
setPosition = ( ) => {
182
- const sliderEl = document . querySelector ( '.aip-progress__slider' ) ;
183
+ const slider = document . querySelector ( '.aip-progress__slider' ) ;
183
184
184
- if ( ! sliderEl ) {
185
+ if ( ! slider ) {
185
186
return ;
186
187
}
187
188
188
189
// recalculate slider element position to ensure no external
189
190
// event (such as fullscreen or window redimension) changed it.
190
- this . setState ( {
191
- sliderWidth : sliderEl . getBoundingClientRect ( ) . width
192
- } ) ;
191
+ const { left, width } = slider ! . getBoundingClientRect ( ) ;
192
+
193
+ this . sliderWidth = width ;
194
+ this . sliderPosition = left ;
193
195
} ;
194
196
195
197
clickHandler = ( evt : React . MouseEvent < HTMLElement > ) => {
@@ -203,43 +205,40 @@ class Progress extends Component<ISeekBarSlider, IState> {
203
205
this . setPosition ( ) ;
204
206
205
207
// trigger first recomputation to simulate simple click.
206
- const el = document . querySelector ( '.aip-progress' ) ! as HTMLElement ;
207
- const mouseX = evt . pageX - el . offsetLeft ;
208
+ const newTime = this . getTimeFromPosition ( evt . pageX ) ;
208
209
209
- this . props . seek ( this . getTimeFromPosition ( mouseX ) ) ;
210
+ this . props . seek ( newTime ) ;
210
211
this . setState ( { userInteracting : true } ) ;
211
- this . updateCurrentTime ( mouseX ) ;
212
+ this . updateCurrentTime ( newTime ) ;
212
213
213
214
document . addEventListener ( 'mousemove' , this . mouseMoveHandler , true ) ;
214
215
document . addEventListener ( 'mouseup' , this . mouseUpHandler , true ) ;
215
216
} ;
216
217
217
218
mouseUpHandler = ( evt : MouseEvent ) => {
218
219
( document . querySelector ( '.aip-progress__slider' ) as HTMLElement ) ! . blur ( ) ;
219
- const el = document . querySelector ( '.aip-progress' ) ! as HTMLElement ;
220
220
221
221
this . setState ( { userInteracting : false } ) ;
222
+ const newTime = this . getTimeFromPosition ( evt . pageX ) ;
222
223
223
- this . updateCurrentTime ( evt . pageX - el . offsetLeft ) ;
224
+ this . updateCurrentTime ( newTime ) ;
224
225
225
226
document . removeEventListener ( 'mousemove' , this . mouseMoveHandler , true ) ;
226
227
document . removeEventListener ( 'mouseup' , this . mouseUpHandler , true ) ;
227
228
} ;
228
229
229
230
mouseMoveHandler = ( evt : MouseEvent ) => {
230
- const el = document . querySelector ( '.aip-progress' ) ! as HTMLElement ;
231
- const mouseX = evt . pageX - el . offsetLeft ;
231
+ const newTime = this . getTimeFromPosition ( evt . pageX ) ;
232
232
233
- this . props . seek ( this . getTimeFromPosition ( mouseX ) ) ;
234
- this . throttledUpdateCurrentTime ( mouseX ) ;
233
+ this . props . seek ( newTime ) ;
234
+ this . throttledUpdateCurrentTime ( newTime ) ;
235
235
} ;
236
236
237
- updateCurrentTime = ( mouseX : number ) => {
237
+ updateCurrentTime = ( time : number ) => {
238
238
const [ media ] = this . context ;
239
- const newCurrentTime = this . getTimeFromPosition ( mouseX ) ;
240
239
241
- if ( newCurrentTime !== this . props . currentTime ) {
242
- media . currentTime = newCurrentTime ;
240
+ if ( time !== this . props . currentTime ) {
241
+ media . currentTime = time ;
243
242
}
244
243
} ;
245
244
@@ -248,11 +247,10 @@ class Progress extends Component<ISeekBarSlider, IState> {
248
247
getTimeFromPosition = ( mouseX : number ) => {
249
248
const { duration } = this . props ;
250
249
251
- const positionDifference = bounded ( mouseX , 0 , this . state . sliderWidth ) ;
252
-
253
- const time = round (
254
- duration * unitToRatio ( positionDifference , this . state . sliderWidth )
255
- ) ;
250
+ const sliderXMax = this . sliderPosition + this . sliderWidth ;
251
+ const boundedX = bounded ( mouseX , this . sliderPosition , sliderXMax ) ;
252
+ const positionDifference = boundedX - this . sliderPosition ;
253
+ const time = duration * unitToRatio ( positionDifference , this . sliderWidth ) ;
256
254
257
255
return time ;
258
256
} ;
0 commit comments