1- import React from 'react' ;
1+ import React , { useEffect , useState } from 'react' ;
2+ import { Lock } from 'lucide-react' ;
23import { debounce } from './utils/debounce' ;
34import type { NonDeleted , ExcalidrawEmbeddableElement } from '@atyrode/excalidraw/element/types' ;
45import type { AppState } from '@atyrode/excalidraw/types' ;
@@ -65,6 +66,7 @@ export const renderCustomEmbeddable = (
6566 < div className = "custom-embed" >
6667 < div className = "custom-embed__title-bar" >
6768 < div className = "custom-embed__title-bar__text" > { title } </ div >
69+ < LockIndicator />
6870 </ div >
6971 < div className = "custom-embed__content" >
7072 { content }
@@ -78,6 +80,7 @@ export const renderCustomEmbeddable = (
7880 < div className = "custom-embed" >
7981 < div className = "custom-embed__title-bar" >
8082 < div className = "custom-embed__title-bar__text" > { title } </ div >
83+ < LockIndicator />
8184 </ div >
8285 < div className = "custom-embed__content" >
8386 < iframe className = "custom-embed__content--iframe" src = { element . link } />
@@ -87,14 +90,44 @@ export const renderCustomEmbeddable = (
8790 }
8891} ;
8992
93+ // Lock icon component that shows when scrolling
94+ const LockIndicator = ( ) => {
95+ const [ visible , setVisible ] = useState ( false ) ;
96+
97+ useEffect ( ( ) => {
98+ const handleScrollStateChange = ( event : CustomEvent < { isScrolling : boolean } > ) => {
99+ setVisible ( event . detail . isScrolling ) ;
100+ } ;
101+
102+ // Add event listener for scroll state changes
103+ document . addEventListener ( 'scrollStateChange' , handleScrollStateChange as EventListener ) ;
104+
105+ // Clean up
106+ return ( ) => {
107+ document . removeEventListener ( 'scrollStateChange' , handleScrollStateChange as EventListener ) ;
108+ } ;
109+ } , [ ] ) ;
110+
111+ return (
112+ < div className = { `custom-embed__lock-icon ${ visible ? 'visible' : '' } ` } >
113+ < Lock size = { 16 } />
114+ </ div >
115+ ) ;
116+ } ;
117+
90118// Track scrolling state
91119let isScrolling = false ;
120+ // Create a custom event for scrolling state changes
121+ const scrollStateChangeEvent = new CustomEvent ( 'scrollStateChange' , { detail : { isScrolling : false } } ) ;
92122
93123export const lockEmbeddables = ( ) => {
94124 if ( ! isScrolling ) {
95125 isScrolling = true ;
96126 // Set pointer-events to none during scrolling
97127 document . documentElement . style . setProperty ( '--embeddable-pointer-events' , 'none' ) ;
128+ // Dispatch event with updated scrolling state
129+ scrollStateChangeEvent . detail . isScrolling = true ;
130+ document . dispatchEvent ( scrollStateChangeEvent ) ;
98131 }
99132
100133 // Reset the pointer-events after scrolling stops
@@ -106,4 +139,7 @@ const debouncedScrollEnd = debounce(() => {
106139 isScrolling = false ;
107140 // Set pointer-events back to all when not scrolling
108141 document . documentElement . style . setProperty ( '--embeddable-pointer-events' , 'all' ) ;
109- } , 500 ) ; // 150ms debounce seems reasonable, but can be adjusted as needed
142+ // Dispatch event with updated scrolling state
143+ scrollStateChangeEvent . detail . isScrolling = false ;
144+ document . dispatchEvent ( scrollStateChangeEvent ) ;
145+ } , 500 ) ; // 500ms debounce seems reasonable, but can be adjusted as needed
0 commit comments