From 7e542e8694e73d013ee88fc01b266f3536d6cc94 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Sun, 11 May 2025 18:06:15 +0800 Subject: [PATCH] fix: reorganize TTS control view hierarchy, closes #1080 (#1119) --- .../src/app/reader/components/BooksGrid.tsx | 4 ++- .../app/reader/components/ReaderContent.tsx | 2 -- .../app/reader/components/notebook/Header.tsx | 6 ++-- .../app/reader/components/tts/TTSControl.tsx | 33 +++++++++++++++---- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/apps/readest-app/src/app/reader/components/BooksGrid.tsx b/apps/readest-app/src/app/reader/components/BooksGrid.tsx index a1548eed..a1cf0a7f 100644 --- a/apps/readest-app/src/app/reader/components/BooksGrid.tsx +++ b/apps/readest-app/src/app/reader/components/BooksGrid.tsx @@ -18,6 +18,7 @@ import Annotator from './annotator/Annotator'; import FootnotePopup from './FootnotePopup'; import HintInfo from './HintInfo'; import DoubleBorder from './DoubleBorder'; +import TTSControl from './tts/TTSControl'; interface BooksGridProps { bookKeys: string[]; @@ -42,7 +43,7 @@ const BooksGrid: React.FC = ({ bookKeys, onCloseBook }) => { return (
= ({ bookKeys, onCloseBook }) => {
); })} + ); }; diff --git a/apps/readest-app/src/app/reader/components/ReaderContent.tsx b/apps/readest-app/src/app/reader/components/ReaderContent.tsx index 0e50e78b..7f7ae15e 100644 --- a/apps/readest-app/src/app/reader/components/ReaderContent.tsx +++ b/apps/readest-app/src/app/reader/components/ReaderContent.tsx @@ -27,7 +27,6 @@ import Spinner from '@/components/Spinner'; import SideBar from './sidebar/SideBar'; import Notebook from './notebook/Notebook'; import BooksGrid from './BooksGrid'; -import TTSControl from './tts/TTSControl'; const ReaderContent: React.FC<{ ids?: string; settings: SystemSettings }> = ({ ids, settings }) => { const router = useRouter(); @@ -166,7 +165,6 @@ const ReaderContent: React.FC<{ ids?: string; settings: SystemSettings }> = ({ i
- {showDetailsBook && ( -
+
{_('Notebook')}
-
+
+
+
diff --git a/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx b/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx index 2d84bb5a..d5012664 100644 --- a/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx +++ b/apps/readest-app/src/app/reader/components/tts/TTSControl.tsx @@ -38,6 +38,7 @@ const TTSControl = () => { const [timeoutTimestamp, setTimeoutTimestamp] = useState(0); const [timeoutFunc, setTimeoutFunc] = useState | null>(null); + const viewSettings = getViewSettings(bookKey); const popupPadding = useResponsiveSize(POPUP_PADDING); const maxWidth = window.innerWidth - 2 * popupPadding; const popupWidth = Math.min(maxWidth, useResponsiveSize(POPUP_WIDTH)); @@ -286,16 +287,18 @@ const TTSControl = () => { const updatePanelPosition = () => { if (iconRef.current) { const rect = iconRef.current.getBoundingClientRect(); - const windowRect = document.documentElement.getBoundingClientRect(); + const parentRect = + iconRef.current.parentElement?.getBoundingClientRect() || + document.documentElement.getBoundingClientRect(); const trianglePos = { dir: 'up', - point: { x: rect.left + rect.width / 2, y: rect.top - 12 }, + point: { x: rect.left + rect.width / 2 - parentRect.left, y: rect.top - 12 }, } as Position; const popupPos = getPopupPosition( trianglePos, - windowRect, + parentRect, popupWidth, popupHeight, popupPadding, @@ -315,8 +318,23 @@ const TTSControl = () => { setShowPanel(false); }; + useEffect(() => { + if (!iconRef.current || !showPanel) return; + const parentElement = iconRef.current.parentElement; + if (!parentElement) return; + + const resizeObserver = new ResizeObserver(() => { + updatePanelPosition(); + }); + resizeObserver.observe(parentElement); + return () => { + resizeObserver.disconnect(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [showPanel]); + return ( -
+ <> {showPanel && (
{
{ height={popupHeight} position={panelPosition} trianglePosition={trianglePosition} - className='bg-base-200 absolute flex shadow-lg' + className='bg-base-200 flex shadow-lg' > { /> )} -
+ ); };