@@ -353,13 +353,6 @@ export default function PagesVerticalViewer({
353
353
const containerHeight = container . clientHeight ;
354
354
const containerRect = container . getBoundingClientRect ( ) ;
355
355
356
- // Do not track the question page
357
- if ( pageNumber > numPages ) {
358
- setPageNumber ( pageNumber ) ;
359
- startTimeRef . current = Date . now ( ) ;
360
- return ;
361
- }
362
-
363
356
// Always preload surrounding pages during scroll
364
357
const startPage = Math . max ( 0 , pageNumber - 2 - 1 ) ;
365
358
const endPage = Math . min ( numPages - 1 , pageNumber + 2 - 1 ) ;
@@ -391,20 +384,36 @@ export default function PagesVerticalViewer({
391
384
}
392
385
} ) ;
393
386
394
- // Only update page number and track view if the most visible page has changed
387
+ const feedbackElement = document . getElementById ( "feedback-question" ) ;
388
+ if ( feedbackElement ) {
389
+ const feedbackRect = feedbackElement . getBoundingClientRect ( ) ;
390
+ const isFeedbackVisible =
391
+ feedbackRect . top < containerRect . bottom &&
392
+ feedbackRect . bottom > containerRect . top ;
393
+
394
+ if ( isFeedbackVisible ) {
395
+ setPageNumber ( numPagesWithFeedback ) ;
396
+ pageNumberRef . current = numPagesWithFeedback ;
397
+ startTimeRef . current = Date . now ( ) ;
398
+ return ;
399
+ }
400
+ }
401
+
395
402
if ( maxVisiblePage !== pageNumber ) {
396
- const duration = Date . now ( ) - startTimeRef . current ;
397
- trackPageView ( {
398
- linkId,
399
- documentId,
400
- viewId,
401
- duration,
402
- pageNumber : pageNumber ,
403
- versionNumber,
404
- dataroomId,
405
- setViewedPages,
406
- isPreview,
407
- } ) ;
403
+ if ( pageNumber <= numPages ) {
404
+ const duration = Date . now ( ) - startTimeRef . current ;
405
+ trackPageView ( {
406
+ linkId,
407
+ documentId,
408
+ viewId,
409
+ duration,
410
+ pageNumber : pageNumber ,
411
+ versionNumber,
412
+ dataroomId,
413
+ setViewedPages,
414
+ isPreview,
415
+ } ) ;
416
+ }
408
417
409
418
setPageNumber ( maxVisiblePage ) ;
410
419
pageNumberRef . current = maxVisiblePage ;
@@ -470,6 +479,16 @@ export default function PagesVerticalViewer({
470
479
const goToNextPage = ( ) => {
471
480
if ( pageNumber >= numPagesWithAccountCreation ) return ;
472
481
482
+ if ( pageNumber === numPages && enableQuestion && feedback ) {
483
+ const feedbackElement = document . getElementById ( "feedback-question" ) ;
484
+ if ( feedbackElement ) {
485
+ feedbackElement . scrollIntoView ( { behavior : "smooth" , block : "start" } ) ;
486
+ setPageNumber ( numPagesWithFeedback ) ;
487
+ startTimeRef . current = Date . now ( ) ;
488
+ }
489
+ return ;
490
+ }
491
+
473
492
if ( pageNumber > numPages ) {
474
493
const targetImg = imageRefs . current [ pageNumber ] ;
475
494
if ( targetImg ) {
@@ -711,157 +730,153 @@ export default function PagesVerticalViewer({
711
730
className = "flex flex-col items-center gap-2"
712
731
onContextMenu = { ( e ) => e . preventDefault ( ) }
713
732
>
714
- { pageNumber <= numPagesWithAccountCreation &&
715
- pages &&
716
- loadedImages [ pageNumber - 1 ]
717
- ? pages . map ( ( page , index ) => (
718
- < div
719
- key = { index }
720
- className = "relative w-full px-4 md:px-8"
721
- style = { {
722
- width : containerWidth
723
- ? `${ calculateOptimalWidth ( containerWidth , page . metadata , isMobile , isTablet ) } px`
724
- : undefined ,
725
- } }
726
- >
727
- < div className = "viewer-container relative" >
728
- < img
729
- className = "h-auto w-full object-contain"
730
- ref = { ( ref ) => {
731
- imageRefs . current [ index ] = ref ;
732
- if ( ref ) {
733
- ref . onload = ( ) =>
734
- setImageDimensions ( ( prev ) => ( {
735
- ...prev ,
736
- [ index ] : {
737
- width : ref . clientWidth ,
738
- height : ref . clientHeight ,
739
- } ,
740
- } ) ) ;
741
- }
742
- } }
743
- useMap = { `#page-map-${ index + 1 } ` }
744
- src = {
745
- loadedImages [ index ]
746
- ? page . file
747
- : "https://www.papermark.com/_static/blank.gif"
733
+ { pages . map ( ( page , index ) =>
734
+ loadedImages [ index ] ? (
735
+ < div
736
+ key = { index }
737
+ className = "relative w-full px-4 md:px-8"
738
+ style = { {
739
+ width : containerWidth
740
+ ? `${ calculateOptimalWidth ( containerWidth , page . metadata , isMobile , isTablet ) } px`
741
+ : undefined ,
742
+ } }
743
+ >
744
+ < div className = "viewer-container relative" >
745
+ < img
746
+ className = "h-auto w-full object-contain"
747
+ ref = { ( ref ) => {
748
+ imageRefs . current [ index ] = ref ;
749
+ if ( ref ) {
750
+ ref . onload = ( ) =>
751
+ setImageDimensions ( ( prev ) => ( {
752
+ ...prev ,
753
+ [ index ] : {
754
+ width : ref . clientWidth ,
755
+ height : ref . clientHeight ,
756
+ } ,
757
+ } ) ) ;
748
758
}
749
- alt = { `Page ${ index + 1 } ` }
750
- />
751
-
752
- { watermarkConfig && imageDimensions [ index ] ? (
753
- < div className = "absolute left-0 top-0" >
754
- < SVGWatermark
755
- config = { watermarkConfig }
756
- viewerData = { {
757
- email : viewerEmail ,
758
- date : new Date ( ) . toLocaleDateString ( ) ,
759
- time : new Date ( ) . toLocaleTimeString ( ) ,
760
- link : linkName ,
761
- ipAddress : ipAddress ,
762
- } }
763
- documentDimensions = { imageDimensions [ index ] }
764
- pageIndex = { index }
765
- />
766
- </ div >
767
- ) : null }
768
- </ div >
769
-
770
- { page . pageLinks ? (
771
- < map name = { `page-map-${ index + 1 } ` } >
772
- { page . pageLinks
773
- . filter ( ( link ) => ! link . href . includes ( ".gif" ) )
774
- . map ( ( link , linkIndex ) => (
775
- < area
776
- key = { linkIndex }
777
- shape = "rect"
778
- coords = { scaleCoordinates (
779
- link . coords ,
780
- getScaleFactor ( {
781
- naturalHeight : page . metadata . height ,
782
- scaleFactor : page . metadata . scaleFactor ,
783
- } ) ,
784
- ) }
785
- href = { link . href }
786
- onClick = { ( e ) =>
787
- handleLinkClick ( link . href , e )
788
- }
789
- target = {
790
- link . href . startsWith ( "#" )
791
- ? "_self"
792
- : "_blank"
793
- }
794
- rel = {
795
- link . href . startsWith ( "#" )
796
- ? undefined
797
- : "noopener noreferrer"
798
- }
799
- />
800
- ) ) }
801
- </ map >
759
+ } }
760
+ useMap = { `#page-map-${ index + 1 } ` }
761
+ src = {
762
+ loadedImages [ index ]
763
+ ? page . file
764
+ : "https://www.papermark.com/_static/blank.gif"
765
+ }
766
+ alt = { `Page ${ index + 1 } ` }
767
+ />
768
+
769
+ { watermarkConfig && imageDimensions [ index ] ? (
770
+ < div className = "absolute left-0 top-0" >
771
+ < SVGWatermark
772
+ config = { watermarkConfig }
773
+ viewerData = { {
774
+ email : viewerEmail ,
775
+ date : new Date ( ) . toLocaleDateString ( ) ,
776
+ time : new Date ( ) . toLocaleTimeString ( ) ,
777
+ link : linkName ,
778
+ ipAddress : ipAddress ,
779
+ } }
780
+ documentDimensions = { imageDimensions [ index ] }
781
+ pageIndex = { index }
782
+ />
783
+ </ div >
802
784
) : null }
785
+ </ div >
803
786
804
- { page . pageLinks
805
- ? page . pageLinks
806
- . filter ( ( link ) => link . href . includes ( ".gif" ) )
807
- . map ( ( link , linkIndex ) => {
808
- const [ x1 , y1 , x2 , y2 ] = scaleCoordinates (
787
+ { page . pageLinks ? (
788
+ < map name = { `page-map-${ index + 1 } ` } >
789
+ { page . pageLinks
790
+ . filter ( ( link ) => ! link . href . includes ( ".gif" ) )
791
+ . map ( ( link , linkIndex ) => (
792
+ < area
793
+ key = { linkIndex }
794
+ shape = "rect"
795
+ coords = { scaleCoordinates (
809
796
link . coords ,
810
797
getScaleFactor ( {
811
798
naturalHeight : page . metadata . height ,
812
799
scaleFactor : page . metadata . scaleFactor ,
813
800
} ) ,
814
- )
815
- . split ( "," )
816
- . map ( Number ) ;
817
-
818
- const overlayWidth = x2 - x1 ;
819
- const overlayHeight = y2 - y1 ;
820
-
821
- return (
822
- < img
823
- key = { `overlay-${ index } -${ linkIndex } ` }
824
- src = { link . href }
825
- alt = { `Overlay ${ index + 1 } ` }
826
- style = { {
827
- position : "absolute" ,
828
- top : y1 ,
829
- left : x1 ,
830
- width : `${ overlayWidth } px` ,
831
- height : `${ overlayHeight } px` ,
832
- pointerEvents : "none" ,
833
- } }
834
- />
835
- ) ;
836
- } )
837
- : null }
838
- </ div >
839
- ) )
840
- : null }
801
+ ) }
802
+ href = { link . href }
803
+ onClick = { ( e ) => handleLinkClick ( link . href , e ) }
804
+ target = {
805
+ link . href . startsWith ( "#" )
806
+ ? "_self"
807
+ : "_blank"
808
+ }
809
+ rel = {
810
+ link . href . startsWith ( "#" )
811
+ ? undefined
812
+ : "noopener noreferrer"
813
+ }
814
+ />
815
+ ) ) }
816
+ </ map >
817
+ ) : null }
818
+
819
+ { page . pageLinks
820
+ ? page . pageLinks
821
+ . filter ( ( link ) => link . href . includes ( ".gif" ) )
822
+ . map ( ( link , linkIndex ) => {
823
+ const [ x1 , y1 , x2 , y2 ] = scaleCoordinates (
824
+ link . coords ,
825
+ getScaleFactor ( {
826
+ naturalHeight : page . metadata . height ,
827
+ scaleFactor : page . metadata . scaleFactor ,
828
+ } ) ,
829
+ )
830
+ . split ( "," )
831
+ . map ( Number ) ;
832
+
833
+ const overlayWidth = x2 - x1 ;
834
+ const overlayHeight = y2 - y1 ;
835
+
836
+ return (
837
+ < img
838
+ key = { `overlay-${ index } -${ linkIndex } ` }
839
+ src = { link . href }
840
+ alt = { `Overlay ${ index + 1 } ` }
841
+ style = { {
842
+ position : "absolute" ,
843
+ top : y1 ,
844
+ left : x1 ,
845
+ width : `${ overlayWidth } px` ,
846
+ height : `${ overlayHeight } px` ,
847
+ pointerEvents : "none" ,
848
+ } }
849
+ />
850
+ ) ;
851
+ } )
852
+ : null }
853
+ </ div >
854
+ ) : null ,
855
+ ) }
841
856
842
857
{ enableQuestion &&
843
- feedback &&
844
- pageNumber === numPagesWithFeedback ? (
845
- < div
846
- className = { cn ( "relative block h-dvh w-full" ) }
847
- style = { { height : "calc(100dvh - 64px)" } }
848
- >
849
- < Question
850
- accentColor = { brand ?. accentColor }
851
- feedback = { feedback }
852
- viewId = { viewId }
853
- submittedFeedback = { submittedFeedback }
854
- setSubmittedFeedback = { setSubmittedFeedback }
855
- isPreview = { isPreview }
856
- />
857
- </ div >
858
- ) : null }
858
+ feedback &&
859
+ pageNumber >= numPagesWithFeedback - 1 && (
860
+ < div
861
+ id = "feedback-question"
862
+ className = { cn ( "relative block h-dvh w-full" ) }
863
+ style = { { height : "calc(100dvh - 64px)" } }
864
+ >
865
+ < Question
866
+ accentColor = { brand ?. accentColor }
867
+ feedback = { feedback }
868
+ viewId = { viewId }
869
+ submittedFeedback = { submittedFeedback }
870
+ setSubmittedFeedback = { setSubmittedFeedback }
871
+ isPreview = { isPreview }
872
+ />
873
+ </ div >
874
+ ) }
859
875
</ div >
860
876
</ div >
861
877
</ div >
862
878
</ div >
863
879
</ div >
864
-
865
880
{ /* Up arrow - hide on first page */ }
866
881
< div
867
882
className = { cn (
0 commit comments