1
1
import * as React from 'react' ;
2
2
3
3
import { STYLES_NAME } from '@/constants' ;
4
- import { useMediaDevice , useScrollEffect , useStyles , useSwipeDown , useZoomEffect } from '@/hooks' ;
4
+ import {
5
+ useMediaDevice ,
6
+ useScrollDetectionWithAutoFocus ,
7
+ useScrollEffect ,
8
+ useStyles ,
9
+ useSwipeDown ,
10
+ useZoomEffect ,
11
+ } from '@/hooks' ;
5
12
import { ErrorBoundary } from '@/provider/errorBoundary/errorBoundary' ;
6
13
import { FallbackComponent } from '@/provider/errorBoundary/fallbackComponent' ;
7
14
import { DeviceBreakpointsType } from '@/types' ;
@@ -26,23 +33,64 @@ const ModalControlledComponent = React.forwardRef(
26
33
) : JSX . Element => {
27
34
const styles = useStyles < ModalBaseStylesType , V > ( STYLES_NAME . MODAL , variant , ctv ) ;
28
35
const device = useMediaDevice ( ) ;
36
+ const innerRef = React . useRef < HTMLDivElement | null > ( null ) ;
29
37
30
- const conditional = React . useMemo (
38
+ const handleInnerRef = React . useCallback ( node => {
39
+ innerRef . current = node ;
40
+ const modalHeader = innerRef . current ?. querySelector ( '[data-modal-header]' ) as
41
+ | HTMLElement
42
+ | null
43
+ | undefined ;
44
+ const modalContent = innerRef . current ?. querySelector ( '[data-modal-content]' ) as
45
+ | HTMLElement
46
+ | null
47
+ | undefined ;
48
+ const modalDraggableIcon = innerRef . current ?. querySelector ( '[data-modal-draggable-icon]' ) as
49
+ | HTMLElement
50
+ | null
51
+ | undefined ;
52
+ const modalIllustration = innerRef . current ?. querySelector (
53
+ '[data-modal-ilustration-container]'
54
+ ) ?. firstElementChild as HTMLElement | null | undefined ;
55
+
56
+ handleModalZoomEffect ( innerRef . current ) ;
57
+ handleHeaderShadowEffect ( modalHeader ) ;
58
+ handleContentScrollEffect ( modalContent ) ;
59
+ handleIllustrationResizeEffect ( modalIllustration ) ;
60
+ handleContentZoomEffect ( modalContent ) ;
61
+ handleContentScrollDetection ( modalContent ) ;
62
+ handleDraggableIconSwipeDown ( modalDraggableIcon ) ;
63
+ } , [ ] ) ;
64
+
65
+ React . useImperativeHandle ( ref , ( ) => {
66
+ return innerRef ?. current as HTMLDivElement ;
67
+ } , [ ] ) ;
68
+
69
+ const isTabletOrMobile = React . useMemo (
31
70
( ) =>
32
71
device !== DeviceBreakpointsType . DESKTOP && device !== DeviceBreakpointsType . LARGE_DESKTOP ,
33
72
[ device ]
34
73
) ;
35
- const { scrollableRef, resizeRef, shadowRef } = useScrollEffect ( {
36
- conditional,
74
+
75
+ const {
76
+ scrollableRef : handleContentScrollEffect ,
77
+ resizeRef : handleIllustrationResizeEffect ,
78
+ shadowRef : handleHeaderShadowEffect ,
79
+ } = useScrollEffect ( {
80
+ conditional : isTabletOrMobile ,
37
81
shadowStyles : styles . headerContainer ?. box_shadow ,
38
82
} ) ;
39
83
40
- const zoomRef = useZoomEffect ( CONTAINER_STYLES_EDIT , MAX_ZOOM ) ;
41
- const zoomRefChild = useZoomEffect ( CONTENT_STYLES_EDIT , MAX_ZOOM ) ;
84
+ const handleModalZoomEffect = useZoomEffect ( CONTAINER_STYLES_EDIT , MAX_ZOOM ) ;
85
+ const handleContentZoomEffect = useZoomEffect ( CONTENT_STYLES_EDIT , MAX_ZOOM ) ;
42
86
43
- const { setPopoverRef, setDragIconRef } = useSwipeDown ( props . popover ?. animationOptions , ( ) =>
44
- props . onClose ?.( )
45
- ) ;
87
+ const { setPopoverRef : handlePopoverSwipeDown , setDragIconRef : handleDraggableIconSwipeDown } =
88
+ useSwipeDown ( props . popover ?. animationOptions , ( ) => props . onClose ?.( ) ) ;
89
+
90
+ const { hasScroll : contentHasScroll , handleScrollDetection : handleContentScrollDetection } =
91
+ useScrollDetectionWithAutoFocus ( {
92
+ parentElementRef : innerRef ,
93
+ } ) ;
46
94
47
95
const handlePopoverCloseInternally = ( ) => {
48
96
props . popover ?. onCloseInternally ?.( ) ;
@@ -52,16 +100,11 @@ const ModalControlledComponent = React.forwardRef(
52
100
const modalStructure = (
53
101
< ModalStandAlone
54
102
{ ...props }
55
- ref = { ref }
103
+ ref = { handleInnerRef }
104
+ contentHasScroll = { contentHasScroll }
56
105
device = { device }
57
- dragIconRef = { setDragIconRef }
58
- popover = { { ...props . popover , forwardedRef : setPopoverRef } }
59
- resizeRef = { resizeRef }
60
- scrollableRef = { scrollableRef }
61
- shadowRef = { shadowRef }
106
+ popover = { { ...props . popover , forwardedRef : handlePopoverSwipeDown } }
62
107
styles = { styles }
63
- zoomRef = { zoomRef }
64
- zoomRefChild = { zoomRefChild }
65
108
onPopoverCloseInternally = { handlePopoverCloseInternally }
66
109
/>
67
110
) ;
0 commit comments