diff --git a/packages/main/__karma_snapshots__/Page.md b/packages/main/__karma_snapshots__/Page.md
index 35fefb74c03..9a87d8d8bc2 100644
--- a/packages/main/__karma_snapshots__/Page.md
+++ b/packages/main/__karma_snapshots__/Page.md
@@ -3,18 +3,18 @@
#### `Basic Page`
```
-
} />}
+ onNavButtonPress={action('onNavButtonPress')}
>
diff --git a/packages/main/src/components/Page/index.tsx b/packages/main/src/components/Page/index.tsx
index 1ae8b0e6f51..16b157322ad 100644
--- a/packages/main/src/components/Page/index.tsx
+++ b/packages/main/src/components/Page/index.tsx
@@ -1,7 +1,8 @@
-import { Event, StyleClassHelper, withStyles } from '@ui5/webcomponents-react-base';
-import React, { Component, ReactElement, ReactNode } from 'react';
-import { ClassProps } from '../../interfaces/ClassProps';
+import { Event, StyleClassHelper } from '@ui5/webcomponents-react-base';
+import React, { forwardRef, ReactElement, ReactNode, Ref, useCallback, useMemo } from 'react';
+import { createUseStyles } from 'react-jss';
import { CommonProps } from '../../interfaces/CommonProps';
+import { JSSTheme } from '../../interfaces/JSSTheme';
import { Bar } from '../../lib/Bar';
import { Button } from '../../lib/Button';
import { ButtonDesign } from '../../lib/ButtonDesign';
@@ -23,89 +24,94 @@ export interface PagePropTypes extends CommonProps {
children: ReactElement
| Array> | ReactNode;
}
-interface PagePropsInternal extends PagePropTypes, ClassProps {}
-
-@withStyles(styles)
-export class Page extends Component {
- static defaultProps = {
- showHeader: true,
- showFooter: false,
- showBackButton: true,
- renderCustomHeader: null,
- renderCustomFooter: null,
- title: '',
- backgroundDesign: PageBackgroundDesign.Standard
- };
-
- private handleNavBackButtonPress = (e) => {
- this.props.onNavButtonPress(Event.of(this, e.getOriginalEvent()));
- };
-
- private renderBackButton = () => {
- return (
-
- );
- };
-
- private renderTitle = () => {this.props.title};
-
- private renderHeader = () => {
- const { showBackButton } = this.props;
- return (
- null}
- renderContentMiddle={this.renderTitle}
- />
- );
- };
-
- render() {
- const {
- children,
- showFooter,
- showHeader,
- classes,
- className,
- style,
- renderCustomHeader,
- renderCustomFooter,
- backgroundDesign,
- tooltip,
- innerRef,
- slot
- } = this.props as PagePropsInternal;
-
- const pageContainer = StyleClassHelper.of(classes.pageContainer);
- const headerClasses = StyleClassHelper.of(classes.pageHeader, classes.baseBar);
- const footerClasses = StyleClassHelper.of(classes.pageFooter, classes.baseBar);
-
- if (showHeader) {
- pageContainer.put(classes.pageWithHeader);
- }
+const useStyles = createUseStyles>(styles, {
+ name: 'Page'
+});
+
+const Page = forwardRef((props: PagePropTypes, ref: Ref) => {
+ const {
+ children,
+ showFooter,
+ showHeader,
+ showBackButton,
+ className,
+ style,
+ renderCustomHeader,
+ renderCustomFooter,
+ backgroundDesign,
+ tooltip,
+ slot,
+ onNavButtonPress,
+ title
+ } = props;
+
+ const classes = useStyles();
- if (showFooter) {
- pageContainer.put(classes.pageWithFooter);
+ const handleNavBackButtonPress = useCallback(
+ (e) => {
+ if (typeof onNavButtonPress === 'function') {
+ onNavButtonPress(Event.of(null, e.getOriginalEvent()));
+ }
+ },
+ [onNavButtonPress]
+ );
+
+ const renderBackButton = useCallback(() => {
+ if (showBackButton) {
+ return (
+
+ );
}
+ return null;
+ }, [showBackButton]);
+
+ const renderTitle = useCallback(() => {title}, [title]);
- if (className) {
- pageContainer.put(className);
+ const header = useMemo(() => {
+ if (renderCustomHeader) {
+ return renderCustomHeader();
}
- pageContainer.put(classes[`background${backgroundDesign}`]);
-
- return (
-
- {showHeader && (
-
- {renderCustomHeader && renderCustomHeader()}
- {!renderCustomHeader && this.renderHeader()}
-
- )}
-
- {showFooter && (
-
- )}
-
- );
+ return ;
+ }, [renderCustomHeader, renderTitle, renderBackButton]);
+
+ const pageContainer = StyleClassHelper.of(classes.pageContainer);
+ const headerClasses = StyleClassHelper.of(classes.pageHeader, classes.baseBar);
+ const footerClasses = StyleClassHelper.of(classes.pageFooter, classes.baseBar);
+
+ if (showHeader) {
+ pageContainer.put(classes.pageWithHeader);
}
-}
+
+ if (showFooter) {
+ pageContainer.put(classes.pageWithFooter);
+ }
+
+ if (className) {
+ pageContainer.put(className);
+ }
+
+ pageContainer.put(classes[`background${backgroundDesign}`]);
+
+ return (
+
+ {showHeader && }
+
+ {showFooter && }
+
+ );
+});
+
+Page.defaultProps = {
+ showHeader: true,
+ showFooter: false,
+ showBackButton: true,
+ renderCustomHeader: null,
+ renderCustomFooter: null,
+ title: '',
+ backgroundDesign: PageBackgroundDesign.Standard
+};
+
+Page.displayName = 'Page';
+
+export { Page };