@@ -59,11 +59,11 @@ export interface DynamicPageProps extends Omit<CommonProps, 'title'> {
5959 * Defines the current state of the component.
6060 */
6161enum HEADER_STATES {
62- AUTO ,
63- VISIBLE_PINNED ,
64- HIDDEN_PINNED ,
65- VISIBLE ,
66- HIDDEN
62+ AUTO = 'AUTO' ,
63+ VISIBLE_PINNED = 'VISIBLE_PINNED' ,
64+ HIDDEN_PINNED = 'HIDDEN_PINNED' ,
65+ VISIBLE = 'VISIBLE' ,
66+ HIDDEN = 'HIDDEN'
6767}
6868/**
6969 * The dynamic page is a generic layout control designed to support various floorplans and use cases.
@@ -82,14 +82,16 @@ const DynamicPage: FC<DynamicPageProps> = forwardRef((props: DynamicPageProps, r
8282 showHideHeaderButton,
8383 headerContentPinnable,
8484 alwaysShowContentHeader,
85- children
85+ children,
86+ className
8687 } = props ;
8788 const passThroughProps = usePassThroughHtmlProps ( props ) ;
8889
8990 const useStyles = createComponentStyles ( styles , { name : 'DynamicPage' } ) ;
9091 const classes = useStyles ( ) ;
9192 const dynamicPageClasses = StyleClassHelper . of ( classes . dynamicPage , GlobalStyleClasses . sapScrollBar ) ;
9293 dynamicPageClasses . put ( classes [ `background${ backgroundDesign } ` ] ) ;
94+ dynamicPageClasses . putIfPresent ( className ) ;
9395
9496 const anchorBarRef : RefObject < HTMLDivElement > = useRef ( ) ;
9597 const dynamicPageRef : RefObject < HTMLDivElement > = useConsolidatedRef ( ref ) ;
@@ -99,11 +101,6 @@ const DynamicPage: FC<DynamicPageProps> = forwardRef((props: DynamicPageProps, r
99101 const [ headerState , setHeaderState ] = useState < HEADER_STATES > (
100102 alwaysShowContentHeader ? HEADER_STATES . VISIBLE_PINNED : HEADER_STATES . AUTO
101103 ) ;
102- const headerStateRef = React . useRef ( headerState ) ;
103- const setHeaderStateRef = ( data ) => {
104- headerStateRef . current = data ;
105- setHeaderState ( data ) ;
106- } ;
107104
108105 // observe heights of header parts
109106 const { topHeaderHeight, headerContentHeight } = useObserveHeights (
@@ -118,31 +115,30 @@ const DynamicPage: FC<DynamicPageProps> = forwardRef((props: DynamicPageProps, r
118115 dynamicPageClasses . put ( classes . headerCollapsed ) ;
119116 }
120117
118+ useEffect ( ( ) => {
119+ const oneTimeScrollHandler = ( ) => {
120+ setHeaderState ( HEADER_STATES . AUTO ) ;
121+ } ;
122+ if ( headerState === HEADER_STATES . VISIBLE || headerState === HEADER_STATES . HIDDEN ) {
123+ dynamicPageRef . current ?. addEventListener ( 'scroll' , oneTimeScrollHandler , { once : true } ) ;
124+ }
125+ return ( ) => {
126+ dynamicPageRef . current ?. removeEventListener ( 'scroll' , oneTimeScrollHandler ) ;
127+ } ;
128+ } , [ dynamicPageRef , headerState ] ) ;
129+
121130 const onToggleHeaderContentVisibility = useCallback (
122131 ( e , element ?: Element | HTMLElement ) => {
123- let srcElement = e . target ;
124- if ( element ) {
125- srcElement = element ;
126- }
132+ const srcElement = element ?? e . target ;
127133 const shouldHideHeader = srcElement . icon === 'slim-arrow-up' ;
128- let headerStateResetOnScroll = false ;
129- setHeaderStateRef ( ( oldState ) => {
134+ setHeaderState ( ( oldState ) => {
130135 if ( oldState === HEADER_STATES . VISIBLE_PINNED || oldState === HEADER_STATES . HIDDEN_PINNED ) {
131136 return shouldHideHeader ? HEADER_STATES . HIDDEN_PINNED : HEADER_STATES . VISIBLE_PINNED ;
132137 }
133- headerStateResetOnScroll = true ;
134138 return shouldHideHeader ? HEADER_STATES . HIDDEN : HEADER_STATES . VISIBLE ;
135139 } ) ;
136- dynamicPageRef . current . addEventListener (
137- 'scroll' ,
138- ( ) => {
139- if ( headerStateRef . current !== HEADER_STATES . VISIBLE_PINNED && headerStateResetOnScroll )
140- setHeaderStateRef ( HEADER_STATES . AUTO ) ;
141- } ,
142- { once : true }
143- ) ;
144140 } ,
145- [ dynamicPageRef . current , headerStateRef . current , classes . headerCollapsed ]
141+ [ setHeaderState ]
146142 ) ;
147143
148144 const onHoverToggleButton = useCallback (
@@ -163,21 +159,21 @@ const DynamicPage: FC<DynamicPageProps> = forwardRef((props: DynamicPageProps, r
163159 const handleHeaderPinnedChange = useCallback (
164160 ( headerWillPin ) => {
165161 if ( headerWillPin ) {
166- setHeaderStateRef ( HEADER_STATES . VISIBLE_PINNED ) ;
162+ setHeaderState ( HEADER_STATES . VISIBLE_PINNED ) ;
167163 } else {
168- setHeaderStateRef ( HEADER_STATES . AUTO ) ;
164+ setHeaderState ( HEADER_STATES . VISIBLE ) ;
169165 }
170166 } ,
171- [ setHeaderStateRef ]
167+ [ setHeaderState ]
172168 ) ;
173169
174170 useEffect ( ( ) => {
175171 if ( alwaysShowContentHeader ) {
176172 setHeaderState ( HEADER_STATES . VISIBLE_PINNED ) ;
177173 } else {
178- setHeaderStateRef ( HEADER_STATES . AUTO ) ;
174+ setHeaderState ( HEADER_STATES . AUTO ) ;
179175 }
180- } , [ alwaysShowContentHeader ] ) ;
176+ } , [ alwaysShowContentHeader , setHeaderState ] ) ;
181177
182178 return (
183179 < div
0 commit comments