Set up posts in store, get working from FilterPosts

- also, set it up to be mobile responsive
This commit is contained in:
Matt Rider 2019-07-05 12:47:44 -03:00
parent a875fe0d5e
commit 3b6db5f631
4 changed files with 111 additions and 44 deletions

View File

@ -34,6 +34,7 @@
<script> <script>
import Dropdown from '~/components/Dropdown' import Dropdown from '~/components/Dropdown'
import { filterPosts } from '~/graphql/PostQuery.js' import { filterPosts } from '~/graphql/PostQuery.js'
import { mapMutations } from 'vuex'
export default { export default {
components: { components: {
@ -46,7 +47,6 @@ export default {
}, },
data() { data() {
return { return {
filter: {},
pageSize: 12, pageSize: 12,
} }
}, },
@ -63,33 +63,24 @@ export default {
}, },
}, },
methods: { methods: {
...mapMutations({
setPosts: 'posts/SET_POSTS',
}),
filterPosts(name) { filterPosts(name) {
this.filter = { categories_some: { name } } this.filter = { categories_some: { name } }
this.$apollo.mutate({ this.$apollo
mutation: filterPosts(this.$i18n), .query({
variables: { query: filterPosts(this.$i18n),
filter: this.filter, variables: {
first: this.pageSize, filter: this.filter,
offset: 0, first: this.pageSize,
}, offset: 0,
update: (store, { data: { Post } }) => { },
const data = store.readQuery({ })
query: filterPosts(this.$i18n), .then(({ data: { Post } }) => {
variables: { this.setPosts(Post)
filter: {}, })
first: this.pageSize, .catch(error => this.$toast.error(error.message))
offset: 0,
},
})
data.Post = Post
data.Post.push(Post)
const index = data.Post.findIndex(old => old.id === Post.id)
if (index !== -1) {
data.Post.splice(index, 1)
}
store.writeQuery({ query: filterPosts(this.$i18n), data })
},
})
}, },
}, },
} }

View File

@ -3,13 +3,23 @@
<div class="main-navigation"> <div class="main-navigation">
<ds-container class="main-navigation-container" style="padding: 10px 10px;"> <ds-container class="main-navigation-container" style="padding: 10px 10px;">
<div> <div>
<ds-flex> <ds-flex class="main-navigation-flex">
<ds-flex-item :width="{ base: '49px', md: '150px', lg: '15%' }"> <ds-flex-item :width="{ lg: '5%' }" />
<a v-router-link style="display: inline-flex" href="/"> <ds-flex-item :width="{ base: '80%', sm: '80%', md: '80%', lg: '15%' }">
<a @click="$router.go('/')">
<ds-logo /> <ds-logo />
</a> </a>
</ds-flex-item> </ds-flex-item>
<ds-flex-item :width="{ lg: '50%' }"> <ds-flex-item
:width="{ base: '20%', sm: '20%', md: '20%', lg: '0%' }"
class="mobile-hamburger-menu"
>
<ds-button icon="bars" @click="toggleMobileMenuView" right />
</ds-flex-item>
<ds-flex-item
:width="{ base: '100%', sm: '100%', md: '50%', lg: '45%' }"
:class="{ 'hide-mobile-menu': !toggleMobileMenu }"
>
<div id="nav-search-box" v-on:click="unfolded" @blur.capture="foldedup"> <div id="nav-search-box" v-on:click="unfolded" @blur.capture="foldedup">
<search-input <search-input
id="nav-search" id="nav-search"
@ -22,18 +32,26 @@
/> />
</div> </div>
</ds-flex-item> </ds-flex-item>
<ds-flex-item :width="{ lg: '10%' }"> <ds-flex-item
:width="{ base: '100%', sm: '100%', md: '10%', lg: '10%' }"
:class="{ 'hide-mobile-menu': !toggleMobileMenu }"
>
<no-ssr> <no-ssr>
<filter-posts <filter-posts placement="bottom" offset="23" :categories="categories" />
class="topbar-locale-switch"
placement="bottom"
offset="23"
:categories="categories"
/>
</no-ssr> </no-ssr>
</ds-flex-item> </ds-flex-item>
<ds-flex-item width="200px" style="background-color:white"> <ds-flex-item
<div class="main-navigation-right" style="float:right"> :width="{ base: '100%', sm: '100%', md: '100%', lg: '20%' }"
style="background-color:white"
:class="{ 'hide-mobile-menu': !toggleMobileMenu }"
>
<div
class="main-navigation-right"
:class="{
'desktop-view': !toggleMobileMenu,
'hide-mobile-menu': !toggleMobileMenu,
}"
>
<no-ssr> <no-ssr>
<locale-switch class="topbar-locale-switch" placement="bottom" offset="23" /> <locale-switch class="topbar-locale-switch" placement="bottom" offset="23" />
</no-ssr> </no-ssr>
@ -135,6 +153,7 @@ export default {
data() { data() {
return { return {
mobileSearchVisible: false, mobileSearchVisible: false,
toggleMobileMenu: false,
} }
}, },
computed: { computed: {
@ -214,6 +233,9 @@ export default {
foldedup: function() { foldedup: function() {
document.getElementById('nav-search-box').classList.remove('unfolded') document.getElementById('nav-search-box').classList.remove('unfolded')
}, },
toggleMobileMenuView() {
this.toggleMobileMenu = !this.toggleMobileMenu
},
}, },
} }
</script> </script>
@ -245,6 +267,10 @@ export default {
flex: 1; flex: 1;
} }
.main-navigation-right .desktop-view {
float: right;
}
.avatar-menu-trigger { .avatar-menu-trigger {
user-select: none; user-select: none;
display: flex; display: flex;
@ -288,4 +314,21 @@ export default {
} }
} }
} }
@media only screen and (min-width: 960px) {
.mobile-hamburger-menu {
display: none;
}
}
@media only screen and (max-width: 960px) {
#nav-search-box,
.main-navigation-right {
margin: 10px 0px;
}
.hide-mobile-menu {
display: none;
}
}
</style> </style>

View File

@ -2,10 +2,14 @@
<div> <div>
<ds-flex :width="{ base: '100%' }" gutter="base"> <ds-flex :width="{ base: '100%' }" gutter="base">
<ds-flex-item> <ds-flex-item>
<filter-menu :user="currentUser" @changeFilterBubble="changeFilterBubble" /> <filter-menu
:user="currentUser"
@changeFilterBubble="changeFilterBubble"
:categories="categories"
/>
</ds-flex-item> </ds-flex-item>
<hc-post-card <hc-post-card
v-for="(post, index) in uniq(Post)" v-for="(post, index) in posts"
:key="post.id" :key="post.id"
:post="post" :post="post"
:width="{ base: '100%', xs: '100%', md: '50%', xl: '33%' }" :width="{ base: '100%', xs: '100%', md: '50%', xl: '33%' }"
@ -31,7 +35,7 @@ import FilterMenu from '~/components/FilterMenu/FilterMenu.vue'
import uniqBy from 'lodash/uniqBy' import uniqBy from 'lodash/uniqBy'
import HcPostCard from '~/components/PostCard' import HcPostCard from '~/components/PostCard'
import HcLoadMore from '~/components/LoadMore.vue' import HcLoadMore from '~/components/LoadMore.vue'
import { mapGetters } from 'vuex' import { mapGetters, mapActions, mapMutations } from 'vuex'
import { filterPosts } from '~/graphql/PostQuery.js' import { filterPosts } from '~/graphql/PostQuery.js'
export default { export default {
@ -43,24 +47,36 @@ export default {
data() { data() {
return { return {
// Initialize your apollo data // Initialize your apollo data
Post: [],
page: 1, page: 1,
pageSize: 12, pageSize: 12,
filter: {}, filter: {},
} }
}, },
watch: {
Post(post) {
this.setPosts(this.Post)
},
},
computed: { computed: {
...mapGetters({ ...mapGetters({
currentUser: 'auth/user', currentUser: 'auth/user',
categories: 'categories/categories',
posts: 'posts/posts',
}), }),
tags() { tags() {
return this.Post ? this.Post[0].tags.map(tag => tag.name) : '-' return this.posts ? this.posts.tags.map(tag => tag.name) : '-'
}, },
offset() { offset() {
return (this.page - 1) * this.pageSize return (this.page - 1) * this.pageSize
}, },
}, },
methods: { methods: {
...mapActions({
fetchCategories: 'categories/fetchCategories',
}),
...mapMutations({
setPosts: 'posts/SET_POSTS',
}),
changeFilterBubble(filter) { changeFilterBubble(filter) {
this.filter = filter this.filter = filter
this.$apollo.queries.Post.refresh() this.$apollo.queries.Post.refresh()

17
webapp/store/posts.js Normal file
View File

@ -0,0 +1,17 @@
export const state = () => {
return {
posts: [],
}
}
export const mutations = {
SET_POSTS(state, posts) {
state.posts = posts || null
},
}
export const getters = {
posts(state) {
return state.posts || []
},
}