diff --git a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx index 744aefad..1fc91598 100644 --- a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx +++ b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx @@ -106,7 +106,7 @@ const FoliateViewer: React.FC<{ isScrolling.current = true; const detail = (event as CustomEvent).detail; - if (detail.reason === 'follow-scroll') return; + if (detail.reason !== 'scroll') return; if (!viewRef.current!.renderer.scrolled) return; const parallelViews = getParallels(bookKey); if (parallelViews && parallelViews.size > 0) { @@ -121,22 +121,36 @@ const FoliateViewer: React.FC<{ } }; - const handleClickTurnPage = (msg: MessageEvent) => { - if (msg.data && msg.data.type === 'iframe-single-click' && msg.data.bookKey === bookKey) { - const viewElement = containerRef.current; - if (viewElement) { - const rect = viewElement.getBoundingClientRect(); - const { screenX } = msg.data; + const handleClickTurnPage = ( + msg: MessageEvent | React.MouseEvent, + ) => { + if (msg instanceof MessageEvent) { + if (msg.data && msg.data.type === 'iframe-single-click' && msg.data.bookKey === bookKey) { + const viewElement = containerRef.current; + if (viewElement) { + const rect = viewElement.getBoundingClientRect(); + const { screenX } = msg.data; - const eventConsumed = eventDispatcher.dispatchSync('iframe-single-click', { screenX }); - if (!eventConsumed) { - if (screenX >= rect.left + rect.width / 2) { - viewRef.current?.goRight(); - } else if (screenX < rect.left + rect.width / 2) { - viewRef.current?.goLeft(); + const eventConsumed = eventDispatcher.dispatchSync('iframe-single-click', { screenX }); + if (!eventConsumed) { + if (screenX >= rect.left + rect.width / 2) { + viewRef.current?.goRight(); + } else if (screenX < rect.left + rect.width / 2) { + viewRef.current?.goLeft(); + } } } } + } else { + const { clientX } = msg; + const width = window.innerWidth; + const leftThreshold = width * 0.5; + const rightThreshold = width * 0.5; + if (clientX < leftThreshold) { + viewRef.current?.goLeft(); + } else if (clientX > rightThreshold) { + viewRef.current?.goRight(); + } } }; @@ -178,7 +192,9 @@ const FoliateViewer: React.FC<{ const animated = viewSettings.animated!; const maxColumnCount = viewSettings.maxColumnCount!; const maxInlineSize = - maxColumnCount === 1 ? ONE_COLUMN_MAX_INLINE_SIZE : viewSettings.maxInlineSize!; + maxColumnCount === 1 || isScrolled + ? ONE_COLUMN_MAX_INLINE_SIZE + : viewSettings.maxInlineSize!; const maxBlockSize = viewSettings.maxBlockSize!; if (animated) { view.renderer.setAttribute('animated', ''); @@ -224,7 +240,13 @@ const FoliateViewer: React.FC<{ // eslint-disable-next-line react-hooks/exhaustive-deps }, [viewInited]); - return
; + return ( +
handleClickTurnPage(event)} + ref={containerRef} + /> + ); }; export default FoliateViewer; diff --git a/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx b/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx index 306a2a3a..362b91cd 100644 --- a/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx +++ b/apps/readest-app/src/app/reader/components/settings/LayoutPanel.tsx @@ -74,6 +74,9 @@ const LayoutPanel: React.FC<{ bookKey: string }> = ({ bookKey }) => { setSettings(settings); } view?.renderer.setAttribute('gap', `${gapPercent}%`); + if (viewSettings.scrolled) { + view?.renderer.setAttribute('flow', 'scrolled'); + } // eslint-disable-next-line react-hooks/exhaustive-deps }, [gapPercent]); @@ -87,7 +90,7 @@ const LayoutPanel: React.FC<{ bookKey: string }> = ({ bookKey }) => { view?.renderer.setAttribute('max-column-count', maxColumnCount); view?.renderer.setAttribute( 'max-inline-size', - `${maxColumnCount === 1 ? ONE_COLUMN_MAX_INLINE_SIZE : maxInlineSize}px`, + `${maxColumnCount === 1 || viewSettings.scrolled ? ONE_COLUMN_MAX_INLINE_SIZE : maxInlineSize}px`, ); // eslint-disable-next-line react-hooks/exhaustive-deps }, [maxColumnCount]); @@ -101,7 +104,7 @@ const LayoutPanel: React.FC<{ bookKey: string }> = ({ bookKey }) => { } view?.renderer.setAttribute( 'max-inline-size', - `${maxColumnCount === 1 ? ONE_COLUMN_MAX_INLINE_SIZE : maxInlineSize}px`, + `${maxColumnCount === 1 || viewSettings.scrolled ? ONE_COLUMN_MAX_INLINE_SIZE : maxInlineSize}px`, ); // eslint-disable-next-line react-hooks/exhaustive-deps }, [maxInlineSize]); diff --git a/packages/foliate-js b/packages/foliate-js index 8df42aff..80c51427 160000 --- a/packages/foliate-js +++ b/packages/foliate-js @@ -1 +1 @@ -Subproject commit 8df42aff5786045de5ac348381a12e036eaa270c +Subproject commit 80c51427eabcf5dcf61f3dd0f1b9bc903957f94f