88 classNames ,
99 isUIFeatureAnIframeFeature ,
1010} from '@standardnotes/snjs'
11- import { CSSProperties , UIEventHandler , useEffect , useMemo , useRef } from 'react'
11+ import { CSSProperties , useCallback , useEffect , useMemo , useRef } from 'react'
1212import { MutuallyExclusiveMediaQueryBreakpoints , useMediaQuery } from '@/Hooks/useMediaQuery'
1313import { useApplication } from '../ApplicationProvider'
1414import IframeFeatureView from '../ComponentView/IframeFeatureView'
@@ -19,6 +19,7 @@ import { useLinkingController } from '@/Controllers/LinkingControllerProvider'
1919import LinkedItemBubblesContainer from '../LinkedItems/LinkedItemBubblesContainer'
2020import usePreference from '@/Hooks/usePreference'
2121import { useResponsiveEditorFontSize } from '@/Utils/getPlaintextFontSize'
22+ import { getScrollParent } from '@/Utils'
2223
2324export const ReadonlyNoteContent = ( {
2425 note,
@@ -33,7 +34,7 @@ export const ReadonlyNoteContent = ({
3334 showLinkedItems ?: boolean
3435 scrollPos ?: number
3536 shouldSyncScroll ?: boolean
36- onScroll ?: UIEventHandler
37+ onScroll ?: ( { target } : { target : EventTarget | null } ) => void
3738} ) => {
3839 const application = useApplication ( )
3940 const linkingController = useLinkingController ( )
@@ -64,6 +65,27 @@ export const ReadonlyNoteContent = ({
6465 } , [ application , componentViewer ] )
6566
6667 const containerRef = useRef < HTMLDivElement > ( null )
68+ const scrollerRef = useRef < HTMLElement | null > ( )
69+
70+ const setScroller = useCallback ( ( ) => {
71+ if ( scrollerRef . current ) {
72+ return
73+ }
74+
75+ scrollerRef . current = containerRef . current ?. querySelector < HTMLElement > ( 'textarea, .ContentEditable__root' )
76+
77+ if ( ! scrollerRef . current ) {
78+ return
79+ }
80+
81+ const isScrollerOverflowing = scrollerRef . current . scrollHeight > scrollerRef . current . clientHeight
82+ if ( ! isScrollerOverflowing ) {
83+ const closestScrollParent = getScrollParent ( scrollerRef . current )
84+ if ( closestScrollParent ) {
85+ scrollerRef . current = closestScrollParent
86+ }
87+ }
88+ } , [ ] )
6789
6890 useEffect ( ( ) => {
6991 if ( ! shouldSyncScroll ) {
@@ -74,16 +96,41 @@ export const ReadonlyNoteContent = ({
7496 return
7597 }
7698
77- const scroller = containerRef . current . querySelector ( 'textarea, .ContentEditable__root' )
78-
79- if ( ! scroller ) {
80- return
99+ if ( ! scrollerRef . current ) {
100+ setScroller ( )
81101 }
82102
83- scroller . scrollTo ( {
103+ scrollerRef . current ? .scrollTo ( {
84104 top : scrollPos ,
85105 } )
86- } , [ scrollPos , shouldSyncScroll ] )
106+ } , [ scrollPos , setScroller , shouldSyncScroll ] )
107+
108+ useEffect (
109+ function setupOnScrollForSuper ( ) {
110+ if ( note . noteType !== NoteType . Super ) {
111+ return
112+ }
113+
114+ setScroller ( )
115+
116+ const scroller = scrollerRef . current
117+
118+ if ( ! scroller ) {
119+ return
120+ }
121+
122+ const scrollHandler = ( event : Event ) => {
123+ onScroll ?.( event )
124+ }
125+
126+ scroller . addEventListener ( 'scroll' , scrollHandler )
127+
128+ return ( ) => {
129+ scroller . removeEventListener ( 'scroll' , scrollHandler )
130+ }
131+ } ,
132+ [ note . noteType , onScroll , setScroller ] ,
133+ )
87134
88135 const lineHeight = usePreference ( PrefKey . EditorLineHeight )
89136 const fontSize = usePreference ( PrefKey . EditorFontSize )
@@ -123,7 +170,6 @@ export const ReadonlyNoteContent = ({
123170 readonly
124171 className = "blocks-editor relative h-full resize-none p-4 text-base focus:shadow-none focus:outline-none"
125172 spellcheck = { content . spellcheck }
126- onScroll = { onScroll }
127173 > </ BlocksEditor >
128174 </ BlocksEditorComposer >
129175 </ div >
0 commit comments