Improve progress bar dragging detection

This commit is contained in:
schroda
2024-12-28 02:04:19 +01:00
parent 0c6872edb3
commit 6bae3aaf3a
3 changed files with 15 additions and 23 deletions

View File

@@ -71,6 +71,7 @@ const BaseReaderProgressBar = ({
direction: ReturnType<typeof ReaderService.useGetThemeDirection>; direction: ReturnType<typeof ReaderService.useGetThemeDirection>;
}) => { }) => {
const progressBarRef = useRef<HTMLDivElement | null>(null); const progressBarRef = useRef<HTMLDivElement | null>(null);
const draggingDetectionTimeout = useRef<NodeJS.Timeout>();
const [totalPagesTextWidth, setTotalPagesTextWidth] = useState(0); const [totalPagesTextWidth, setTotalPagesTextWidth] = useState(0);
const totalPagesTextRef = useRef<HTMLSpanElement | null>(null); const totalPagesTextRef = useRef<HTMLSpanElement | null>(null);
@@ -131,7 +132,10 @@ const BaseReaderProgressBar = ({
<ReaderProgressBarSlotsActionArea <ReaderProgressBarSlotsActionArea
{...slotProps?.progressBarSlotsActionArea} {...slotProps?.progressBarSlotsActionArea}
ref={progressBarRef} ref={progressBarRef}
onTouchEnd={() => setIsDragging(false)} onTouchEnd={() => {
setIsDragging(false);
clearTimeout(draggingDetectionTimeout.current);
}}
onTouchStart={(event) => { onTouchStart={(event) => {
if (!progressBarRef.current) { if (!progressBarRef.current) {
return; return;
@@ -150,9 +154,14 @@ const BaseReaderProgressBar = ({
undefined, undefined,
false, false,
); );
setIsDragging(true);
clearTimeout(draggingDetectionTimeout.current);
draggingDetectionTimeout.current = setTimeout(() => setIsDragging(true), 250);
}}
onMouseUp={() => {
setIsDragging(false);
clearTimeout(draggingDetectionTimeout.current);
}} }}
onMouseUp={() => setIsDragging(false)}
onMouseDown={(event) => { onMouseDown={(event) => {
if (!progressBarRef.current) { if (!progressBarRef.current) {
return; return;
@@ -171,7 +180,9 @@ const BaseReaderProgressBar = ({
undefined, undefined,
false, false,
); );
setIsDragging(true);
clearTimeout(draggingDetectionTimeout.current);
draggingDetectionTimeout.current = setTimeout(() => setIsDragging(true), 250);
}} }}
> >
<ReaderProgressBarSlotsContainer {...slotProps?.progressBarSlotsContainer}> <ReaderProgressBarSlotsContainer {...slotProps?.progressBarSlotsContainer}>
@@ -206,7 +217,6 @@ const BaseReaderProgressBar = ({
currentPagesIndex={currentPage.pagesIndex} currentPagesIndex={currentPage.pagesIndex}
pagesLength={pages.length} pagesLength={pages.length}
isDragging={isDragging} isDragging={isDragging}
setIsDragging={setIsDragging}
progressBarPosition={progressBarPosition} progressBarPosition={progressBarPosition}
> >
{slots?.progressBarCurrentPage} {slots?.progressBarCurrentPage}

View File

@@ -19,7 +19,6 @@ export const ReaderProgressBarCurrentPageSlot = ({
currentPagesIndex, currentPagesIndex,
pagesLength, pagesLength,
isDragging, isDragging,
setIsDragging,
boxProps, boxProps,
children, children,
progressBarPosition, progressBarPosition,
@@ -48,22 +47,6 @@ export const ReaderProgressBarCurrentPageSlot = ({
}), }),
...boxProps?.sx, ...boxProps?.sx,
}} }}
onTouchEnd={(e) => {
e.stopPropagation();
setIsDragging(false);
}}
onTouchStart={(e) => {
e.stopPropagation();
setIsDragging(true);
}}
onMouseUp={(e) => {
e.stopPropagation();
setIsDragging(false);
}}
onMouseDown={(e) => {
e.stopPropagation();
setIsDragging(true);
}}
> >
{children} {children}
</Box> </Box>

View File

@@ -62,7 +62,6 @@ export interface CurrentPageSlotProps extends Pick<IReaderSettings, 'progressBar
currentPagesIndex: number; currentPagesIndex: number;
pagesLength: number; pagesLength: number;
isDragging: boolean; isDragging: boolean;
setIsDragging: (isDragging: boolean) => void;
boxProps?: BoxProps; boxProps?: BoxProps;
} }