@@ -24,6 +24,7 @@ export default function PdfViewer({ url, name }: PdfViewerProps) {
2424 const [ pageNumber , setPageNumber ] = useState < number > ( 1 ) ;
2525 const [ scale , setScale ] = useState < number > ( 1 ) ;
2626 const [ isFullscreen , setIsFullscreen ] = useState < boolean > ( false ) ;
27+ const [ inputValue , setInputValue ] = useState ( pageNumber . toString ( ) ) ;
2728 const pageRefs = useRef < ( HTMLDivElement | null ) [ ] > ( [ ] ) ;
2829 const containerRef = useRef < HTMLDivElement > ( null ) ;
2930
@@ -87,11 +88,21 @@ export default function PdfViewer({ url, name }: PdfViewerProps) {
8788 } ) ;
8889 } ;
8990
90- const handlePageChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
91- const value = parseInt ( e . target . value , 10 ) ;
92- if ( ! isNaN ( value ) && value >= 1 && value <= ( numPages ?? 1 ) ) {
93- setPageNumber ( value ) ;
94- scrollToPage ( value ) ;
91+ const handlePageChange = ( e : React . KeyboardEvent < HTMLInputElement > ) => {
92+ if ( e . key === "Enter" ) {
93+ const target = e . target as HTMLInputElement ;
94+ if ( / ^ \d + $ / . test ( inputValue ) ) {
95+ const value = parseInt ( inputValue , 10 ) ;
96+ if ( value >= 1 && value <= ( numPages ?? 1 ) ) {
97+ setPageNumber ( value ) ;
98+ scrollToPage ( value ) ;
99+ } else {
100+ setInputValue ( pageNumber . toString ( ) ) ;
101+ }
102+ } else {
103+ setInputValue ( pageNumber . toString ( ) ) ;
104+ }
105+ target . blur ( ) ;
95106 }
96107 } ;
97108
@@ -132,6 +143,10 @@ export default function PdfViewer({ url, name }: PdfViewerProps) {
132143 }
133144 } ;
134145
146+ useEffect ( ( ) => {
147+ setInputValue ( pageNumber . toString ( ) ) ;
148+ } , [ pageNumber ] ) ;
149+
135150 useEffect ( ( ) => {
136151 const handleFullscreenChange = ( ) => {
137152 setIsFullscreen ( ! ! document . fullscreenElement ) ;
@@ -238,11 +253,11 @@ export default function PdfViewer({ url, name }: PdfViewerProps) {
238253 < FaLessThan />
239254 </ Button >
240255 < input
241- type = "number "
242- value = { pageNumber }
243- onChange = { handlePageChange }
244- min = { 1 }
245- max = { numPages }
256+ type = "text "
257+ value = { inputValue }
258+ onChange = { ( e ) => setInputValue ( e . target . value ) }
259+ onKeyDown = { ( e ) => handlePageChange ( e ) }
260+ onFocus = { ( ) => setInputValue ( "" ) }
246261 className = "h-10 w-16 rounded border p-1 text-center [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"
247262 />
248263 < span > of { numPages ?? 1 } </ span >
@@ -300,11 +315,11 @@ export default function PdfViewer({ url, name }: PdfViewerProps) {
300315 < FaLessThan />
301316 </ Button >
302317 < input
303- type = "number "
304- value = { pageNumber }
305- onChange = { handlePageChange }
306- min = { 1 }
307- max = { numPages }
318+ type = "text "
319+ value = { inputValue }
320+ onChange = { ( e ) => setInputValue ( e . target . value ) }
321+ onKeyDown = { ( e ) => handlePageChange ( e ) }
322+ onFocus = { ( ) => setInputValue ( "" ) }
308323 className = "h-10 w-16 rounded border p-1 text-center [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"
309324 />
310325 < span > of { numPages ?? 1 } </ span >
0 commit comments