diff --git a/src/newsreader/js/pages/homepage/App.js b/src/newsreader/js/pages/homepage/App.js index 01ca773..897bb15 100644 --- a/src/newsreader/js/pages/homepage/App.js +++ b/src/newsreader/js/pages/homepage/App.js @@ -5,20 +5,15 @@ import { isEqual } from 'lodash'; import { fetchCategories } from './actions/categories'; -import Sidebar from './components/sidebar/Sidebar.js'; import PostList from './components/postlist/PostList.js'; import PostModal from './components/PostModal.js'; import Messages from '../../components/Messages.js'; class App extends React.Component { - componentDidMount() { - this.props.fetchCategories(); - } - + // TODO: render sidebar separate from main component render() { return ( <> - )} + {/* TODO: check this styling */} {this.props.error && ( )} @@ -70,8 +66,4 @@ const mapStateToProps = state => { return { error, post: state.selected.post }; }; -const mapDispatchToProps = dispatch => ({ - fetchCategories: () => dispatch(fetchCategories()), -}); - -export default connect(mapStateToProps, mapDispatchToProps)(App); +export default connect(mapStateToProps)(App); diff --git a/src/newsreader/js/pages/homepage/components/sidebar/Sidebar.js b/src/newsreader/js/pages/homepage/components/sidebar/Sidebar.js index 88a69f2..d4f2ea5 100644 --- a/src/newsreader/js/pages/homepage/components/sidebar/Sidebar.js +++ b/src/newsreader/js/pages/homepage/components/sidebar/Sidebar.js @@ -1,9 +1,9 @@ import React from 'react'; import { connect } from 'react-redux'; -import { isEqual } from 'lodash'; import { filterCategories, filterRules } from './filters.js'; +import { fetchCategories } from '../../actions/categories'; import { CATEGORY_TYPE, RULE_TYPE } from '../../constants.js'; import LoadingIndicator from '../../../../components/LoadingIndicator.js'; import CategoryItem from './CategoryItem.js'; @@ -12,6 +12,10 @@ import ReadButton from './ReadButton.js'; // TODO: show empty category message class Sidebar extends React.Component { + componentDidMount() { + this.props.fetchCategories(); + } + render() { const categoryItems = this.props.categories.items.map(category => { const rules = this.props.rules.items.filter(rule => { @@ -33,7 +37,7 @@ class Sidebar extends React.Component { [CATEGORY_TYPE, RULE_TYPE].includes(this.props.selected.item.type); return ( -
+ <> {(this.props.categories.isFetching || this.props.rules.isFetching) && ( )} @@ -44,7 +48,7 @@ class Sidebar extends React.Component { {showReadButton && } -
+ ); } } @@ -55,4 +59,8 @@ const mapStateToProps = state => ({ selected: state.selected, }); -export default connect(mapStateToProps)(Sidebar); +const mapDispatchToProps = dispatch => ({ + fetchCategories: () => dispatch(fetchCategories()), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(Sidebar); diff --git a/src/newsreader/js/pages/homepage/index.js b/src/newsreader/js/pages/homepage/index.js index 86cdd09..4d52dcb 100644 --- a/src/newsreader/js/pages/homepage/index.js +++ b/src/newsreader/js/pages/homepage/index.js @@ -5,12 +5,24 @@ import { Provider } from 'react-redux'; import configureStore from './configureStore.js'; import App from './App.js'; +import Sidebar from './components/sidebar/Sidebar.js'; -const page = document.getElementById('homepage--page'); +const homepageBody = document.getElementById('homepage--page'); +const containers = [...homepageBody.children].filter(element => element.matches('.main')); +const sidebars = document.getElementsByClassName('sidebar'); +const store = configureStore(); -if (page) { - const store = configureStore(); +[...sidebars].forEach(sidebar => { + const sidebarMount = ( + + + + ); + ReactDOM.render(sidebarMount, sidebar); +}); + +[...containers].forEach(container => { const settings = JSON.parse(document.getElementById('homepageSettings').textContent); const { feedUrl, subredditUrl, timelineUrl, categoriesUrl } = settings; @@ -27,5 +39,5 @@ if (page) { ); - ReactDOM.render(app, page); -} + ReactDOM.render(app, container); +}); diff --git a/src/newsreader/news/core/templates/news/core/views/homepage.html b/src/newsreader/news/core/templates/news/core/views/homepage.html index a135314..2570b51 100644 --- a/src/newsreader/news/core/templates/news/core/views/homepage.html +++ b/src/newsreader/news/core/templates/news/core/views/homepage.html @@ -1,9 +1,11 @@ {% extends "base.html" %} {% load static %} -{% block content %} -
-{% endblock content %} +{% block page_id %}id="homepage--page"{% endblock %} + +{% block sidebar %} + +{% endblock %} {% block scripts %} {{ homepageSettings|json_script:"homepageSettings" }} diff --git a/src/newsreader/scss/components/body/_body.scss b/src/newsreader/scss/components/body/_body.scss index 34bba4c..d6748fa 100644 --- a/src/newsreader/scss/components/body/_body.scss +++ b/src/newsreader/scss/components/body/_body.scss @@ -4,6 +4,11 @@ font-family: Rubik, sans-serif; font-size: $font-size; + + // TODO add grid area names + display: grid; + grid-template-columns: 1fr 3fr; + grid-gap: 20px; } body { @@ -14,5 +19,4 @@ body { padding: 0; box-sizing: border-box; } - } diff --git a/src/newsreader/scss/components/main/_main.scss b/src/newsreader/scss/components/main/_main.scss index 5d0143f..0e580ad 100644 --- a/src/newsreader/scss/components/main/_main.scss +++ b/src/newsreader/scss/components/main/_main.scss @@ -1,7 +1,8 @@ .main { + grid-column: 2; + grid-row: 2; + display: flex; flex-direction: column; align-items: center; - - margin: 20px 0; } diff --git a/src/newsreader/scss/components/navbar/_navbar.scss b/src/newsreader/scss/components/navbar/_navbar.scss index afdacce..ad81832 100644 --- a/src/newsreader/scss/components/navbar/_navbar.scss +++ b/src/newsreader/scss/components/navbar/_navbar.scss @@ -1,4 +1,7 @@ .nav { + grid-column: 1 /3; + grid-row: 1; + display: flex; justify-content: center; align-items: center; @@ -6,9 +9,6 @@ padding: 10px 0; width: 100%; - position: sticky; - top: 0; - background-color: var(--lightest-accent-color); ol { diff --git a/src/newsreader/scss/components/sidebar/_sidebar.scss b/src/newsreader/scss/components/sidebar/_sidebar.scss index 0521af4..c21f652 100644 --- a/src/newsreader/scss/components/sidebar/_sidebar.scss +++ b/src/newsreader/scss/components/sidebar/_sidebar.scss @@ -1,13 +1,10 @@ .sidebar { + grid-column: 1; + grid-row: 2; + display: flex; flex-direction: column; align-items: center; - align-self: start; - - position: sticky; - top: 50px; - - width: 20%; &__nav { width: 100%; @@ -15,7 +12,6 @@ overflow: auto; list-style: none; - } &__container { diff --git a/src/newsreader/scss/pages/homepage/index.scss b/src/newsreader/scss/pages/homepage/index.scss index 30f5a50..8dffdf8 100644 --- a/src/newsreader/scss/pages/homepage/index.scss +++ b/src/newsreader/scss/pages/homepage/index.scss @@ -1,9 +1,9 @@ #homepage--page { - display: flex; - flex-direction: row; - align-items: initial; - width: 100%; + & .main { + display: flex; + flex-direction: row; + align-items: initial; - margin: 20px 0 0 0; - background-color: initial; + background-color: initial; + } } diff --git a/src/newsreader/templates/base.html b/src/newsreader/templates/base.html index 3c65329..5ed7cce 100644 --- a/src/newsreader/templates/base.html +++ b/src/newsreader/templates/base.html @@ -10,7 +10,7 @@ {% endblock %} - +