diff --git a/src/newsreader/js/pages/homepage/App.js b/src/newsreader/js/pages/homepage/App.js index 01ca773..5b5acde 100644 --- a/src/newsreader/js/pages/homepage/App.js +++ b/src/newsreader/js/pages/homepage/App.js @@ -5,6 +5,7 @@ import { isEqual } from 'lodash'; import { fetchCategories } from './actions/categories'; +import ScrollTop from './components/ScrollTop.js'; import Sidebar from './components/sidebar/Sidebar.js'; import PostList from './components/postlist/PostList.js'; import PostModal from './components/PostModal.js'; @@ -41,6 +42,8 @@ class App extends React.Component { /> )} + + {this.props.error && ( )} diff --git a/src/newsreader/js/pages/homepage/components/ScrollTop.js b/src/newsreader/js/pages/homepage/components/ScrollTop.js new file mode 100644 index 0000000..24228b1 --- /dev/null +++ b/src/newsreader/js/pages/homepage/components/ScrollTop.js @@ -0,0 +1,40 @@ +import React from 'react'; + +export default class ScrollTop extends React.Component { + scrollListener = ::this.scrollListener; + + state = { showTop: false, showBottom: false }; + + componentDidMount() { + window.addEventListener('scroll', this.scrollListener); + } + + scrollListener() { + const showBottom = window.innerHeight + window.scrollY < document.body.offsetHeight; + + this.setState({ + showTop: window.pageYOffset > 0 ? true : false, + showBottom: showBottom, + }); + } + + render() { + return ( +
+ {this.state.showTop && ( + window.scrollTo(0, 0)} + /> + )} + + {this.state.showBottom && ( + window.scrollTo(0, document.body.scrollHeight)} + /> + )} +
+ ); + } +} diff --git a/src/newsreader/scss/components/index.scss b/src/newsreader/scss/components/index.scss index d0419ac..d64031b 100644 --- a/src/newsreader/scss/components/index.scss +++ b/src/newsreader/scss/components/index.scss @@ -26,3 +26,4 @@ @import './post-message/index'; @import './posts/index'; @import './posts-info/index'; +@import './scroll-to-top/index'; diff --git a/src/newsreader/scss/components/modal/_post-modal.scss b/src/newsreader/scss/components/modal/_post-modal.scss index f6483fe..a286abd 100644 --- a/src/newsreader/scss/components/modal/_post-modal.scss +++ b/src/newsreader/scss/components/modal/_post-modal.scss @@ -5,4 +5,6 @@ padding: 0; cursor: pointer; + + z-index: 1000; } diff --git a/src/newsreader/scss/components/scroll-to-top/_scroll-to-top.scss b/src/newsreader/scss/components/scroll-to-top/_scroll-to-top.scss new file mode 100644 index 0000000..84b40e6 --- /dev/null +++ b/src/newsreader/scss/components/scroll-to-top/_scroll-to-top.scss @@ -0,0 +1,33 @@ +.scroll-to-top { + display: flex; + gap: 10px; + + position: fixed; + right: 15%; + bottom: 0; + + margin: 0 0 20px 0; + + &:hover { + cursor: pointer; + } + + &__icon { + font-style: initial; + padding: 10px; + + background-color: var(--lightest-accent-color); + + &--top:before { + @include font-awesome; + + content: "\f062"; + } + + &--bottom:before { + @include font-awesome; + + content: "\f063"; + } + } +} diff --git a/src/newsreader/scss/components/scroll-to-top/index.scss b/src/newsreader/scss/components/scroll-to-top/index.scss new file mode 100644 index 0000000..dcaf7de --- /dev/null +++ b/src/newsreader/scss/components/scroll-to-top/index.scss @@ -0,0 +1 @@ +@import './scroll-to-top';