From fbba723c2ca54e20ea374ed77daf105edf1fc6de Mon Sep 17 00:00:00 2001 From: srgooglo Date: Mon, 6 Jun 2022 09:59:57 +0200 Subject: [PATCH] added `LoadMore` component --- .../app/src/components/LoadMore/index.jsx | 82 +++++++++++++++++++ .../app/src/components/LoadMore/index.less | 14 ++++ packages/app/src/components/index.js | 1 + 3 files changed, 97 insertions(+) create mode 100644 packages/app/src/components/LoadMore/index.jsx create mode 100644 packages/app/src/components/LoadMore/index.less diff --git a/packages/app/src/components/LoadMore/index.jsx b/packages/app/src/components/LoadMore/index.jsx new file mode 100644 index 00000000..eac1b28e --- /dev/null +++ b/packages/app/src/components/LoadMore/index.jsx @@ -0,0 +1,82 @@ +import React from "react" +import PropTypes from "prop-types" +import classnames from "classnames" +import IntersectionObserver from "intersection-observer-polyfill" + +import "./index.less" + +export default class LoadMore extends React.Component { + constructor() { + super(...arguments) + this.insideViewportCb = this.insideViewportCb.bind(this) + } + + static propTypes = { + onBottom: PropTypes.func, + fetching: PropTypes.bool, + hasMore: PropTypes.bool, + NoResult: PropTypes.func, + Footer: PropTypes.func + } + + componentDidMount() { + try { + const node = document.getElementById("bottom") + + this.observer = new IntersectionObserver(this.insideViewportCb) + this.observer.observe(node) + } catch (err) { + console.log("err in finding node", err) + } + + window.addEventListener("scroll", this.handleOnScroll) + } + + insideViewportCb(entries) { + const { fetching, onBottom } = this.props + + entries.forEach(element => { + if (element.intersectionRatio > 0 && !fetching) { + onBottom() + } + }) + } + + componentWillUnmount() { + if (this.observer) { + this.observer = null + } + } + + render() { + const { + className, + children, + hasMore, + loadingComponent, + noResultComponent, + } = this.props + + return
+
+ {children} +
+ +
+ +
+ {loadingComponent && React.createElement(loadingComponent)} +
+ +
+ {noResultComponent ? React.createElement(noResultComponent) : "No more result"} +
+
+ } +} \ No newline at end of file diff --git a/packages/app/src/components/LoadMore/index.less b/packages/app/src/components/LoadMore/index.less new file mode 100644 index 00000000..6a0bd2ae --- /dev/null +++ b/packages/app/src/components/LoadMore/index.less @@ -0,0 +1,14 @@ +.infinite-scroll { + min-height: 32vw; + position: relative; + + .no-result { + text-align: center; + } + + .list-loader { + height: 16vw; + margin: auto; + width: 16vw; + } +} \ No newline at end of file diff --git a/packages/app/src/components/index.js b/packages/app/src/components/index.js index 0a1a8f07..6c57591b 100644 --- a/packages/app/src/components/index.js +++ b/packages/app/src/components/index.js @@ -24,6 +24,7 @@ export { default as ImageUploader } from "./ImageUploader" export { default as ImageViewer } from "./ImageViewer" export { default as Login } from "./Login" export { default as Image } from "./Image" +export { default as LoadMore } from "./LoadMore" // BUTTONS export { default as LikeButton } from "./LikeButton"