Skip to content

Commit 1c73396

Browse files
fix(DynamicPage): add className prop to dynamic page classes (#1159)
1 parent 4da2848 commit 1c73396

2 files changed

Lines changed: 31 additions & 32 deletions

File tree

packages/main/src/components/DynamicPage/DynamicPage.test.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { FormGroup } from '@ui5/webcomponents-react/lib/FormGroup';
2020
import { FormItem } from '@ui5/webcomponents-react/lib/FormItem';
2121
import { ObjectStatus } from '@ui5/webcomponents-react/lib/ObjectStatus';
2222
import { ValueState } from '@ui5/webcomponents-react/lib/ValueState';
23+
import { createPassThroughPropsTest } from '@shared/tests/utils';
2324

2425
const renderComponent = () => (
2526
<DynamicPage
@@ -400,4 +401,6 @@ describe('DynamicPage', () => {
400401
const { asFragment } = render(renderComponentHideHeaderButton());
401402
expect(asFragment()).toMatchSnapshot();
402403
});
404+
405+
createPassThroughPropsTest(DynamicPage);
403406
});

packages/main/src/components/DynamicPage/index.tsx

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ export interface DynamicPageProps extends Omit<CommonProps, 'title'> {
5959
* Defines the current state of the component.
6060
*/
6161
enum 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

Comments
 (0)