11import { Box , styled } from '@mui/material' ;
22import React , { useCallback , useEffect , useRef , useState } from 'react' ;
3- import { RemoveScroll } from 'react-remove-scroll' ;
43
54const ScrollbarTrack = styled ( Box , {
65 shouldForwardProp : ( prop ) => prop !== 'visible' ,
76} ) < { visible : boolean } > ( ( { visible } ) => ( {
87 position : 'fixed' ,
98 top : 0 ,
109 right : 0 ,
11- width : '10px' , // Standard scrollbar width (was 8px)
10+ width : '10px' ,
1211 height : '100vh' ,
1312 background : 'transparent' ,
1413 opacity : visible ? 1 : 0 ,
@@ -41,12 +40,11 @@ const ScrollbarThumb = styled(Box, {
4140 } ,
4241} ) ) ;
4342
44- const GlobalCustomScrollbar : React . FC = ( ) => {
43+ export const GlobalCustomScrollbar : React . FC = ( ) => {
4544 const [ isScrollbarVisible , setIsScrollbarVisible ] = useState ( false ) ;
4645 const [ thumbHeight , setThumbHeight ] = useState ( 0 ) ;
4746 const [ thumbTop , setThumbTop ] = useState ( 0 ) ;
4847 const [ isDragging , setIsDragging ] = useState ( false ) ;
49- const [ isScrollLocked , setIsScrollLocked ] = useState ( false ) ;
5048 const [ dragStart , setDragStart ] = useState ( { y : 0 , scrollTop : 0 } ) ;
5149 const [ justFinishedDragging , setJustFinishedDragging ] = useState ( false ) ;
5250 const [ postDragAutoHideActive , setPostDragAutoHideActive ] = useState ( false ) ;
@@ -55,63 +53,8 @@ const GlobalCustomScrollbar: React.FC = () => {
5553 const postDragTimeoutRef = useRef < number > ( ) ;
5654 const isMouseOverScrollbarRef = useRef ( false ) ;
5755
58- // Check if scrolling should be disabled based on open overlays
59- const checkAndUpdateScrollLock = useCallback ( ( ) => {
60- // First check specifically for MuiAutocomplete dropdowns
61- const autocompleteDropdown = document . querySelector ( '.MuiAutocomplete-popper, .MuiAutocomplete-listbox' ) ;
62- if ( autocompleteDropdown ) {
63- // Hide the custom scrollbar but don't apply our scroll lock
64- // (RemoveScroll from SearchBar handles background scroll prevention)
65- setIsScrollLocked ( false ) ;
66- return true ; // Hide scrollbar but don't use our scroll lock
67- }
68-
69- // Check for MUI backdrop (drawer, modal, etc.)
70- const backdrop = document . querySelector ( '.MuiBackdrop-root' ) ;
71- if ( backdrop ) {
72- setIsScrollLocked ( true ) ;
73- return true ;
74- }
75-
76- // Check for open drawer
77- const drawer = document . querySelector ( '[role="presentation"]' ) ;
78- if ( drawer ) {
79- setIsScrollLocked ( true ) ;
80- return true ;
81- }
82-
83- // Check for open select/menu
84- const menu = document . querySelector ( '[role="listbox"], [role="menu"]' ) ;
85- if ( menu ) {
86- setIsScrollLocked ( true ) ;
87- return true ;
88- }
89-
90- // Check for SweetAlert popup
91- const swalPopup = document . querySelector ( '.swal2-container' ) ;
92- if ( swalPopup ) {
93- setIsScrollLocked ( true ) ;
94- return true ;
95- }
96-
97- // Check for any modal or dialog
98- const modal = document . querySelector ( '[role="dialog"]' ) ;
99- if ( modal ) {
100- setIsScrollLocked ( true ) ;
101- return true ;
102- }
103-
104- setIsScrollLocked ( false ) ;
105- return false ;
106- } , [ ] ) ;
10756
10857 const updateScrollbar = useCallback ( ( ) => {
109- // Hide scrollbar if scrolling is disabled
110- if ( checkAndUpdateScrollLock ( ) ) {
111- setIsScrollbarVisible ( false ) ;
112- return ;
113- }
114-
11558 const scrollHeight = document . documentElement . scrollHeight ;
11659 const clientHeight = window . innerHeight ;
11760 const scrollTop = window . pageYOffset || document . documentElement . scrollTop ;
@@ -135,7 +78,7 @@ const GlobalCustomScrollbar: React.FC = () => {
13578
13679 setThumbHeight ( adjustedThumbHeight ) ;
13780 setThumbTop ( newThumbTop ) ;
138- } , [ checkAndUpdateScrollLock ] ) ;
81+ } , [ ] ) ;
13982
14083 const tryHideScrollbar = useCallback ( ( ) => {
14184 if ( ! isDragging && ! isMouseOverScrollbarRef . current ) {
@@ -175,8 +118,7 @@ const GlobalCustomScrollbar: React.FC = () => {
175118 } , [ updateScrollbar , showScrollbar , isDragging , justFinishedDragging , postDragAutoHideActive ] ) ;
176119
177120 const handleMouseEnter = useCallback ( ( ) => {
178- // Don't show scrollbar if scrolling is disabled
179- if ( checkAndUpdateScrollLock ( ) ) return ;
121+
180122
181123 isMouseOverScrollbarRef . current = true ;
182124 // Reset the auto-hide timer when mouse enters scrollbar
@@ -186,7 +128,7 @@ const GlobalCustomScrollbar: React.FC = () => {
186128 setIsScrollbarVisible ( true ) ;
187129 // Start a fresh 2-second timer
188130 hideTimeoutRef . current = window . setTimeout ( tryHideScrollbar , 2000 ) ;
189- } , [ tryHideScrollbar , checkAndUpdateScrollLock ] ) ;
131+ } , [ tryHideScrollbar ] ) ;
190132
191133 const handleMouseLeave = useCallback ( ( ) => {
192134 isMouseOverScrollbarRef . current = false ;
@@ -201,9 +143,6 @@ const GlobalCustomScrollbar: React.FC = () => {
201143 } , [ isDragging , tryHideScrollbar ] ) ;
202144
203145 const handleThumbMouseDown = useCallback ( ( e : React . MouseEvent ) => {
204- // Don't allow dragging if scrolling is disabled
205- if ( checkAndUpdateScrollLock ( ) ) return ;
206-
207146 e . preventDefault ( ) ;
208147
209148 // Temporarily disable smooth scrolling during drag
@@ -218,7 +157,7 @@ const GlobalCustomScrollbar: React.FC = () => {
218157
219158 // Store the original scroll behavior to restore later
220159 ( window as Window & { originalScrollBehavior ?: string } ) . originalScrollBehavior = originalScrollBehavior ;
221- } , [ checkAndUpdateScrollLock ] ) ;
160+ } , [ ] ) ;
222161
223162 const handleMouseMove = useCallback ( ( e : MouseEvent ) => {
224163 if ( ! isDragging ) return ;
@@ -277,9 +216,6 @@ const GlobalCustomScrollbar: React.FC = () => {
277216 } , [ isDragging , tryHideScrollbar ] ) ;
278217
279218 const handleTrackClick = useCallback ( ( e : React . MouseEvent ) => {
280- // Don't allow track clicks if scrolling is disabled
281- if ( checkAndUpdateScrollLock ( ) ) return ;
282-
283219 if ( e . target === e . currentTarget ) {
284220 const rect = e . currentTarget . getBoundingClientRect ( ) ;
285221 const clickY = e . clientY - rect . top ;
@@ -293,7 +229,7 @@ const GlobalCustomScrollbar: React.FC = () => {
293229 behavior : 'smooth'
294230 } ) ;
295231 }
296- } , [ checkAndUpdateScrollLock ] ) ;
232+ } , [ ] ) ;
297233
298234 useEffect ( ( ) => {
299235 const handleGlobalMouseMove = ( e : MouseEvent ) => handleMouseMove ( e ) ;
@@ -345,22 +281,18 @@ const GlobalCustomScrollbar: React.FC = () => {
345281 }
346282
347283 return (
348- < RemoveScroll enabled = { isScrollLocked } >
349- < ScrollbarTrack
350- visible = { isScrollbarVisible }
351- onMouseEnter = { handleMouseEnter }
352- onMouseLeave = { handleMouseLeave }
353- onClick = { handleTrackClick }
354- >
355- < ScrollbarThumb
356- height = { thumbHeight }
357- top = { thumbTop }
358- isDragging = { isDragging }
359- onMouseDown = { handleThumbMouseDown }
360- />
361- </ ScrollbarTrack >
362- </ RemoveScroll >
284+ < ScrollbarTrack
285+ visible = { isScrollbarVisible }
286+ onMouseEnter = { handleMouseEnter }
287+ onMouseLeave = { handleMouseLeave }
288+ onClick = { handleTrackClick }
289+ >
290+ < ScrollbarThumb
291+ height = { thumbHeight }
292+ top = { thumbTop }
293+ isDragging = { isDragging }
294+ onMouseDown = { handleThumbMouseDown }
295+ />
296+ </ ScrollbarTrack >
363297 ) ;
364298} ;
365-
366- export default GlobalCustomScrollbar ;
0 commit comments