@@ -8,6 +8,7 @@ import { PDFSkeleton } from './PDFSkeleton';
88import { useTTS } from '@/contexts/TTSContext' ;
99import { usePDF } from '@/contexts/PDFContext' ;
1010import TTSPlayer from '@/components/player/TTSPlayer' ;
11+ import { useConfig } from '@/contexts/ConfigContext' ;
1112
1213interface PDFViewerProps {
1314 zoomLevel : number ;
@@ -17,6 +18,9 @@ export function PDFViewer({ zoomLevel }: PDFViewerProps) {
1718 const [ containerWidth , setContainerWidth ] = useState < number > ( 0 ) ;
1819 const containerRef = useRef < HTMLDivElement > ( null ) ;
1920
21+ // Config context
22+ const { viewType } = useConfig ( ) ;
23+
2024 // TTS context
2125 const {
2226 currentSentence,
@@ -112,21 +116,36 @@ export function PDFViewer({ zoomLevel }: PDFViewerProps) {
112116 const [ pageWidth , setPageWidth ] = useState < number > ( 595 ) ; // default A4 width
113117 const [ pageHeight , setPageHeight ] = useState < number > ( 842 ) ; // default A4 height
114118
115- // Modify scale calculation function to handle orientation
119+ // Calculate which pages to show based on viewType
120+ const leftPage = viewType === 'dual'
121+ ? ( currDocPage % 2 === 0 ? currDocPage - 1 : currDocPage )
122+ : currDocPage ;
123+ const rightPage = viewType === 'dual'
124+ ? ( currDocPage % 2 === 0 ? currDocPage : currDocPage + 1 )
125+ : null ;
126+
127+ // Modify scale calculation to account for view type
116128 const calculateScale = useCallback ( ( width = pageWidth , height = pageHeight ) : number => {
117- const margin = 24 ; // 24px padding on each side
118- const containerHeight = window . innerHeight - 100 ; // approximate visible height
119- const targetWidth = containerWidth - margin ;
129+ const margin = viewType === 'dual' ? 48 : 24 ; // adjust margin based on view type
130+ const containerHeight = window . innerHeight - 100 ;
131+ const targetWidth = viewType === 'dual'
132+ ? ( containerWidth - margin ) / 2 // divide by 2 for dual pages
133+ : containerWidth - margin ;
120134 const targetHeight = containerHeight - margin ;
121135
122- // Calculate scales based on both dimensions
136+ if ( viewType === 'scroll' ) {
137+ // For scroll mode, use a more comfortable width-based scale
138+ // Use 75% of the width-based scale to make it less zoomed in
139+ const scaleByWidth = ( targetWidth / width ) * 0.75 ;
140+ return scaleByWidth * ( zoomLevel / 100 ) ;
141+ }
142+
123143 const scaleByWidth = targetWidth / width ;
124144 const scaleByHeight = targetHeight / height ;
125145
126- // Use the smaller scale to ensure the page fits both dimensions
127146 const baseScale = Math . min ( scaleByWidth , scaleByHeight ) ;
128147 return baseScale * ( zoomLevel / 100 ) ;
129- } , [ containerWidth , zoomLevel , pageWidth , pageHeight ] ) ;
148+ } , [ containerWidth , zoomLevel , pageWidth , pageHeight , viewType ] ) ;
130149
131150 // Add resize observer effect
132151 useEffect ( ( ) => {
@@ -151,24 +170,61 @@ export function PDFViewer({ zoomLevel }: PDFViewerProps) {
151170 file = { currDocURL }
152171 onLoadSuccess = { ( pdf ) => {
153172 onDocumentLoadSuccess ( pdf ) ;
154- //handlePageChange(1); // Load first page text
155173 } }
156174 className = "flex flex-col items-center m-0"
157175 >
158176 < div >
159- < div className = "flex justify-center" >
160- < Page
161- pageNumber = { currDocPage }
162- renderAnnotationLayer = { true }
163- renderTextLayer = { true }
164- className = "shadow-lg"
165- scale = { calculateScale ( ) }
166- onLoadSuccess = { ( page ) => {
167- setPageWidth ( page . originalWidth ) ;
168- setPageHeight ( page . originalHeight ) ;
169- } }
170- />
171- </ div >
177+ { viewType === 'scroll' ? (
178+ // Scroll mode: render all pages
179+ < div className = "flex flex-col gap-4" >
180+ { currDocPages && [ ...Array ( currDocPages ) ] . map ( ( _ , i ) => (
181+ < Page
182+ key = { `page_${ i + 1 } ` }
183+ pageNumber = { i + 1 }
184+ renderAnnotationLayer = { true }
185+ renderTextLayer = { i + 1 === currDocPage }
186+ className = "shadow-lg"
187+ scale = { calculateScale ( ) }
188+ onLoadSuccess = { ( page ) => {
189+ setPageWidth ( page . originalWidth ) ;
190+ setPageHeight ( page . originalHeight ) ;
191+ } }
192+ />
193+ ) ) }
194+ </ div >
195+ ) : (
196+ // Single/Dual page mode
197+ < div className = "flex justify-center gap-4" >
198+ { currDocPages && leftPage > 0 && (
199+ < Page
200+ key = { `page_${ leftPage } ` }
201+ pageNumber = { leftPage }
202+ renderAnnotationLayer = { true }
203+ renderTextLayer = { leftPage === currDocPage }
204+ className = "shadow-lg"
205+ scale = { calculateScale ( ) }
206+ onLoadSuccess = { ( page ) => {
207+ setPageWidth ( page . originalWidth ) ;
208+ setPageHeight ( page . originalHeight ) ;
209+ } }
210+ />
211+ ) }
212+ { currDocPages && rightPage && rightPage <= currDocPages && viewType === 'dual' && (
213+ < Page
214+ key = { `page_${ rightPage } ` }
215+ pageNumber = { rightPage }
216+ renderAnnotationLayer = { true }
217+ renderTextLayer = { rightPage === currDocPage }
218+ className = "shadow-lg"
219+ scale = { calculateScale ( ) }
220+ onLoadSuccess = { ( page ) => {
221+ setPageWidth ( page . originalWidth ) ;
222+ setPageHeight ( page . originalHeight ) ;
223+ } }
224+ />
225+ ) }
226+ </ div >
227+ ) }
172228 </ div >
173229 </ Document >
174230 < TTSPlayer
0 commit comments