1- import { Button } from "@nextui-org /react" ;
1+ import { Button } from "@heroui /react" ;
22import { Events } from "@superstreamer/player" ;
33import cn from "clsx" ;
44import { useEffect , useRef , useState } from "react" ;
@@ -41,7 +41,7 @@ function PlayButton() {
4141function Seekbar ( ) {
4242 const { player } = usePlayer ( ) ;
4343 const seekableStart = usePlayerSelector ( ( player ) => player . seekableStart ) ;
44- const time = usePlayerSelector ( ( player ) => player . time ) ;
44+ const currentTime = usePlayerSelector ( ( player ) => player . currentTime ) ;
4545 const duration = usePlayerSelector ( ( player ) => player . duration ) ;
4646 const seekTo = usePlayerSelector ( ( player ) => player . seekTo ) ;
4747
@@ -51,9 +51,8 @@ function Seekbar() {
5151 min : seekableStart ,
5252 max : duration ,
5353 onSeeked : ( time ) => {
54- if ( seekTo ( time ) ) {
55- setLastSeekTime ( time ) ;
56- }
54+ seekTo ( time ) ;
55+ setLastSeekTime ( time ) ;
5756 } ,
5857 } ) ;
5958
@@ -62,19 +61,22 @@ function Seekbar() {
6261 return ;
6362 }
6463
65- const onSeekingChange = ( ) => {
66- if ( ! player . seeking ) {
64+ const onTimeChange = ( ) => {
65+ if ( player . seeking || lastSeekTime == null ) {
66+ return ;
67+ }
68+ if ( player . currentTime > lastSeekTime ) {
6769 setLastSeekTime ( null ) ;
6870 }
6971 } ;
7072
71- player . on ( Events . SEEKING_CHANGE , onSeekingChange ) ;
73+ player . on ( Events . TIME_CHANGE , onTimeChange ) ;
7274 return ( ) => {
73- player . off ( Events . SEEKING_CHANGE , onSeekingChange ) ;
75+ player . off ( Events . TIME_CHANGE , onTimeChange ) ;
7476 } ;
75- } , [ player ] ) ;
77+ } , [ player , lastSeekTime ] ) ;
7678
77- const fakeTime = lastSeekTime ?? time ;
79+ const fakeTime = lastSeekTime ?? currentTime ;
7880 let percentage = getPercentage ( fakeTime , duration , seekableStart ) ;
7981 if ( seekbar . seeking ) {
8082 percentage = seekbar . x ;
@@ -166,16 +168,31 @@ function CuePoints() {
166168 return (
167169 < div className = "relative h-4" >
168170 { cuePoints . map ( ( cuePoint ) => {
171+ const left =
172+ ( cuePoint . time - seekableStart ) / ( duration - seekableStart ) ;
173+
174+ let width = 0 ;
175+ if ( cuePoint . duration ) {
176+ const right =
177+ ( cuePoint . time + cuePoint . duration - seekableStart ) /
178+ ( duration - seekableStart ) ;
179+ width = right - left ;
180+ }
181+
169182 return (
170183 < div
171- key = { cuePoint }
184+ key = { cuePoint . time }
172185 style = { {
173- left : `${ ( ( cuePoint - seekableStart ) / ( duration - seekableStart ) ) * 100 } %` ,
186+ left : `${ ( ( cuePoint . time - seekableStart ) / ( duration - seekableStart ) ) * 100 } %` ,
187+ width : width ? `${ width * 100 } %` : undefined ,
174188 } }
175- className = "absolute -translate-x-1/2 flex items-center flex-col "
189+ className = "absolute"
176190 >
177- < div className = "w-[2px] h-2 bg-yellow-500" />
178- < div className = "w-2 h-2 rounded-full bg-yellow-500" />
191+ < div className = "absolute left-0 -translate-x-1/2 flex items-center flex-col" >
192+ < div className = "w-[2px] h-2 bg-yellow-500" />
193+ < div className = "w-2 h-2 rounded-full bg-yellow-500" />
194+ </ div >
195+ < div className = "absolute w-full h-[2px] top-3 bg-yellow-500" />
179196 </ div >
180197 ) ;
181198 } ) }
@@ -184,14 +201,14 @@ function CuePoints() {
184201}
185202
186203function Time ( ) {
187- const time = usePlayerSelector ( ( player ) => player . time ) ;
204+ const currentTime = usePlayerSelector ( ( player ) => player . currentTime ) ;
188205 const seekableStart = usePlayerSelector ( ( player ) => player . seekableStart ) ;
189206 const duration = usePlayerSelector ( ( player ) => player . duration ) ;
190207 const live = usePlayerSelector ( ( player ) => player . live ) ;
191208
192209 return (
193210 < div className = "flex text-sm mb-2" >
194- { hms ( time ) }
211+ { hms ( currentTime ) }
195212 < div className = "grow" />
196213 { live ? `${ hms ( seekableStart ) } - ${ hms ( duration ) } ` : `${ hms ( duration ) } ` }
197214 </ div >
@@ -260,10 +277,7 @@ function Qualities() {
260277}
261278
262279function hms ( seconds : number ) {
263- return (
264- new Date ( seconds * 1000 ) . toUTCString ( ) . match ( / ( \d \d : \d \d : \d \d ) / ) ?. [ 0 ] ??
265- "00:00:00"
266- ) ;
280+ return ( new Date ( seconds * 1000 ) . toUTCString ( ) . match ( / ( \d \d : \d \d : \d \d ) / ) ?. [ 0 ] ?? "00:00:00" ) ;
267281}
268282
269283function getPercentage ( time : number , duration : number , seekableStart : number ) {
0 commit comments