This commit is contained in:
@@ -347,81 +347,45 @@ const BookViewer: FC<BookViewerProps> = ({ pages, catalogSize, documentSettings
|
|||||||
setIsAutoPlayActive(prev => !prev);
|
setIsAutoPlayActive(prev => !prev);
|
||||||
}, [pages.length]);
|
}, [pages.length]);
|
||||||
|
|
||||||
const handleLinkClick = useCallback((linkUrl: string) => {
|
const navigateToPageIndex = useCallback(
|
||||||
if (pages.length <= 1) return;
|
(targetIndex: number) => {
|
||||||
if (linkUrl.startsWith('page://')) {
|
const pageFlipAPI = bookRef.current?.pageFlip();
|
||||||
const action = linkUrl.replace('page://', '');
|
|
||||||
const pageFlipAPI = bookRef.current?.pageFlip() as PageFlipWithFlipController | undefined;
|
|
||||||
|
|
||||||
if (!pageFlipAPI) return;
|
if (!pageFlipAPI) return;
|
||||||
|
|
||||||
|
const clamped = Math.max(0, Math.min(targetIndex, pages.length - 1));
|
||||||
|
pageFlipAPI.turnToPage(clamped);
|
||||||
|
lastFlipPageRef.current = clamped;
|
||||||
|
scheduleEntranceForSpread(clamped);
|
||||||
|
},
|
||||||
|
[pages.length, scheduleEntranceForSpread],
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleLinkClick = useCallback(
|
||||||
|
(linkUrl: string) => {
|
||||||
|
if (pages.length <= 1) return;
|
||||||
|
stopAutoPlayByUser();
|
||||||
|
|
||||||
|
if (!linkUrl.startsWith('page://')) return;
|
||||||
|
|
||||||
|
const action = linkUrl.replace('page://', '');
|
||||||
|
|
||||||
if (action === 'next') {
|
if (action === 'next') {
|
||||||
goToNextPage();
|
goToNextPage();
|
||||||
} else if (action === 'prev') {
|
} else if (action === 'prev') {
|
||||||
goToPrevPage();
|
goToPrevPage();
|
||||||
} else if (action === 'first') {
|
} else if (action === 'first') {
|
||||||
// رفتن به صفحه اول
|
navigateToPageIndex(0);
|
||||||
const flipToFirst = () => {
|
|
||||||
if (currentPage > 0) {
|
|
||||||
triggerFlipPrev(pageFlipAPI);
|
|
||||||
setTimeout(() => {
|
|
||||||
setCurrentPage(prev => {
|
|
||||||
if (prev > 1) {
|
|
||||||
flipToFirst();
|
|
||||||
}
|
|
||||||
return prev - 1;
|
|
||||||
});
|
|
||||||
}, 300);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
flipToFirst();
|
|
||||||
} else if (action === 'last') {
|
} else if (action === 'last') {
|
||||||
// رفتن به صفحه آخر
|
navigateToPageIndex(pages.length - 1);
|
||||||
const lastPageIndex = pages.length - 1;
|
|
||||||
const flipToLast = () => {
|
|
||||||
if (currentPage < lastPageIndex) {
|
|
||||||
pageFlipAPI.flipNext();
|
|
||||||
setTimeout(() => {
|
|
||||||
setCurrentPage(prev => {
|
|
||||||
if (prev < lastPageIndex - 1) {
|
|
||||||
flipToLast();
|
|
||||||
}
|
|
||||||
return prev + 1;
|
|
||||||
});
|
|
||||||
}, 300);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
flipToLast();
|
|
||||||
} else {
|
} else {
|
||||||
// شماره صفحه مشخص (مثل page://3)
|
|
||||||
const pageNum = parseInt(action, 10);
|
const pageNum = parseInt(action, 10);
|
||||||
if (!isNaN(pageNum) && pageNum >= 1 && pageNum <= pages.length) {
|
if (!isNaN(pageNum) && pageNum >= 1 && pageNum <= pages.length) {
|
||||||
const targetIndex = pageNum - 1;
|
navigateToPageIndex(pageNum - 1);
|
||||||
const diff = targetIndex - currentPage;
|
|
||||||
|
|
||||||
const flipToTarget = (remaining: number) => {
|
|
||||||
if (remaining === 0) return;
|
|
||||||
|
|
||||||
if (remaining > 0) {
|
|
||||||
pageFlipAPI.flipNext();
|
|
||||||
setTimeout(() => {
|
|
||||||
setCurrentPage(prev => prev + 1);
|
|
||||||
flipToTarget(remaining - 1);
|
|
||||||
}, 300);
|
|
||||||
} else {
|
|
||||||
triggerFlipPrev(pageFlipAPI);
|
|
||||||
setTimeout(() => {
|
|
||||||
setCurrentPage(prev => prev - 1);
|
|
||||||
flipToTarget(remaining + 1);
|
|
||||||
}, 300);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
flipToTarget(diff);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}, [currentPage, pages.length, goToNextPage, goToPrevPage]);
|
[pages.length, goToNextPage, goToPrevPage, navigateToPageIndex, stopAutoPlayByUser],
|
||||||
|
);
|
||||||
|
|
||||||
const prevFlipKeyRef = useRef(flipKey);
|
const prevFlipKeyRef = useRef(flipKey);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user