diff options
Diffstat (limited to 'src/components/follow_list')
| -rw-r--r-- | src/components/follow_list/follow_list.js | 62 | ||||
| -rw-r--r-- | src/components/follow_list/follow_list.vue | 33 |
2 files changed, 95 insertions, 0 deletions
diff --git a/src/components/follow_list/follow_list.js b/src/components/follow_list/follow_list.js new file mode 100644 index 00000000..6d00eb94 --- /dev/null +++ b/src/components/follow_list/follow_list.js @@ -0,0 +1,62 @@ +import UserCard from '../user_card/user_card.vue' + +const FollowList = { + data () { + return { + loading: false, + bottomedOut: false, + error: false + } + }, + props: ['userId', 'showFollowers'], + created () { + window.addEventListener('scroll', this.scrollLoad) + if (this.entries.length === 0) { + this.fetchEntries() + } + }, + destroyed () { + window.removeEventListener('scroll', this.scrollLoad) + this.$store.dispatch('clearFriendsAndFollowers', this.userId) + }, + computed: { + user () { + return this.$store.getters.userById(this.userId) + }, + entries () { + return this.showFollowers ? this.user.followers : this.user.friends + } + }, + methods: { + fetchEntries () { + if (!this.loading) { + const command = this.showFollowers ? 'addFollowers' : 'addFriends' + this.loading = true + this.$store.dispatch(command, this.userId).then(entries => { + this.error = false + this.loading = false + this.bottomedOut = entries.length === 0 + }).catch(() => { + this.error = true + this.loading = false + }) + } + }, + scrollLoad (e) { + const bodyBRect = document.body.getBoundingClientRect() + const height = Math.max(bodyBRect.height, -(bodyBRect.y)) + if (this.loading === false && + this.bottomedOut === false && + this.$el.offsetHeight > 0 && + (window.innerHeight + window.pageYOffset) >= (height - 750) + ) { + this.fetchEntries() + } + } + }, + components: { + UserCard + } +} + +export default FollowList diff --git a/src/components/follow_list/follow_list.vue b/src/components/follow_list/follow_list.vue new file mode 100644 index 00000000..24ab97d8 --- /dev/null +++ b/src/components/follow_list/follow_list.vue @@ -0,0 +1,33 @@ +<template> + <div class="follow-list"> + <user-card + v-for="entry in entries" + :key="entry.id" :user="entry" + :showFollows="true" + /> + <div class="text-center panel-footer"> + <a v-if="error" @click="fetchEntries" class="alert error"> + {{$t('general.generic_error')}} + </a> + <i v-else-if="loading" class="icon-spin3 animate-spin"/> + <span v-else-if="bottomedOut"></span> + <a v-else @click="fetchEntries">{{$t('general.more')}}</a> + </div> + </div> +</template> + +<script src="./follow_list.js"></script> + +<style lang="scss"> + +.follow-list { + .panel-footer { + padding: 10px; + } + + .error { + font-size: 14px; + } +} + +</style> |
