2020-11-17 08:36:49 +00:00
|
|
|
import React, { Component, createRef } from "react";
|
2020-11-24 12:08:46 +00:00
|
|
|
import { Scrollbar, utils } from "asc-web-components";
|
2020-11-17 08:36:49 +00:00
|
|
|
import { LayoutContextProvider } from "./context";
|
2020-11-25 16:47:09 +00:00
|
|
|
import { isMobile, isSafari, isIOS } from "react-device-detect";
|
2020-11-16 09:29:12 +00:00
|
|
|
|
2020-11-24 12:08:46 +00:00
|
|
|
const { isTouchDevice } = utils.device;
|
2020-11-17 08:36:49 +00:00
|
|
|
class MobileLayout extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
2020-11-16 09:29:12 +00:00
|
|
|
|
2020-11-17 08:36:49 +00:00
|
|
|
this.state = {
|
|
|
|
prevScrollPosition: window.pageYOffset,
|
|
|
|
visibleContent: true,
|
|
|
|
};
|
2020-11-16 09:29:12 +00:00
|
|
|
|
2020-11-17 08:36:49 +00:00
|
|
|
this.scrollRefPage = createRef();
|
|
|
|
}
|
2020-11-16 09:29:12 +00:00
|
|
|
|
2020-11-17 08:36:49 +00:00
|
|
|
componentDidMount() {
|
2020-11-24 08:26:10 +00:00
|
|
|
this.documentElement = document.getElementById("customScrollBar");
|
2020-11-24 12:08:46 +00:00
|
|
|
|
|
|
|
this.documentElement.scrollTo(0, 0);
|
|
|
|
|
2020-11-17 08:36:49 +00:00
|
|
|
this.documentElement.addEventListener(
|
|
|
|
"scroll",
|
|
|
|
this.scrolledTheVerticalAxis
|
|
|
|
);
|
2020-11-24 12:08:46 +00:00
|
|
|
|
|
|
|
// this.setState({ visibleContent: true });
|
2020-11-17 08:36:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
|
|
|
this.documentElement.removeEventListener(
|
|
|
|
"scroll",
|
|
|
|
this.scrolledTheVerticalAxis
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
scrolledTheVerticalAxis = () => {
|
2020-11-24 12:08:46 +00:00
|
|
|
const { prevScrollPosition, visibleContent } = this.state;
|
|
|
|
|
|
|
|
if (visibleContent && isMobile && !isTouchDevice) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-11-17 08:36:49 +00:00
|
|
|
const currentScrollPosition =
|
2020-11-18 15:34:36 +00:00
|
|
|
this.documentElement.scrollTop > 0
|
|
|
|
? this.documentElement.scrollTop
|
|
|
|
: window.pageYOffset;
|
|
|
|
|
2020-11-24 12:08:46 +00:00
|
|
|
let isVisible = prevScrollPosition >= currentScrollPosition;
|
2020-11-17 08:36:49 +00:00
|
|
|
|
2020-11-19 07:00:31 +00:00
|
|
|
if (
|
2020-11-25 16:47:09 +00:00
|
|
|
(isSafari || isIOS) &&
|
2020-11-19 07:00:31 +00:00
|
|
|
currentScrollPosition >=
|
2020-11-24 14:09:32 +00:00
|
|
|
this.documentElement.scrollHeight - this.documentElement.clientHeight &&
|
|
|
|
this.documentElement.scrollHeight !== this.documentElement.clientHeight
|
2020-11-19 07:00:31 +00:00
|
|
|
) {
|
2020-11-24 12:08:46 +00:00
|
|
|
isVisible = false;
|
2020-11-19 07:00:31 +00:00
|
|
|
}
|
|
|
|
|
2020-11-17 08:36:49 +00:00
|
|
|
if (
|
|
|
|
!visibleContent &&
|
|
|
|
this.documentElement.scrollHeight - this.documentElement.clientHeight < 57
|
|
|
|
) {
|
2020-11-24 12:08:46 +00:00
|
|
|
isVisible = true;
|
2020-11-16 09:29:12 +00:00
|
|
|
}
|
2020-11-17 08:36:49 +00:00
|
|
|
|
|
|
|
this.setState({
|
|
|
|
prevScrollPosition: currentScrollPosition,
|
2020-11-24 12:08:46 +00:00
|
|
|
visibleContent: isVisible,
|
2020-11-17 08:36:49 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const scrollProp = { ref: this.scrollRefPage };
|
|
|
|
const { children } = this.props;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Scrollbar {...scrollProp} stype="mediumBlack">
|
|
|
|
<LayoutContextProvider
|
|
|
|
value={{
|
|
|
|
scrollRefLayout: this.scrollRefPage,
|
|
|
|
isVisible: this.state.visibleContent,
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{children}
|
|
|
|
</LayoutContextProvider>
|
|
|
|
</Scrollbar>
|
|
|
|
);
|
2020-11-16 09:29:12 +00:00
|
|
|
}
|
2020-11-17 08:36:49 +00:00
|
|
|
}
|
2020-11-16 09:29:12 +00:00
|
|
|
|
2020-11-17 08:36:49 +00:00
|
|
|
export default MobileLayout;
|