From 8ce513ed09124fa0183943c359950f49ebcf2f89 Mon Sep 17 00:00:00 2001 From: shpuld Date: Thu, 31 Jan 2019 21:11:28 +0200 Subject: initial draft for follows/following pagination --- src/services/api/api.service.js | 10 ++++++++-- .../backend_interactor_service/backend_interactor_service.js | 8 ++++---- src/services/entity_normalizer/entity_normalizer.service.js | 2 ++ 3 files changed, 14 insertions(+), 6 deletions(-) (limited to 'src/services') diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 31b48cb6..1d4790a0 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -247,15 +247,21 @@ const fetchUser = ({id, credentials}) => { .then((data) => parseUser(data)) } -const fetchFriends = ({id, credentials}) => { +const fetchFriends = ({id, page, credentials}) => { let url = `${FRIENDS_URL}?user_id=${id}` + if (page) { + url = url + `&page=${page}` + } return fetch(url, { headers: authHeaders(credentials) }) .then((data) => data.json()) .then((data) => data.map(parseUser)) } -const fetchFollowers = ({id, credentials}) => { +const fetchFollowers = ({id, page, credentials}) => { let url = `${FOLLOWERS_URL}?user_id=${id}` + if (page) { + url = url + `&page=${page}` + } return fetch(url, { headers: authHeaders(credentials) }) .then((data) => data.json()) .then((data) => data.map(parseUser)) diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index f44f52b6..ed7d4b49 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -10,12 +10,12 @@ const backendInteractorService = (credentials) => { return apiService.fetchConversation({id, credentials}) } - const fetchFriends = ({id}) => { - return apiService.fetchFriends({id, credentials}) + const fetchFriends = ({id, page}) => { + return apiService.fetchFriends({id, page, credentials}) } - const fetchFollowers = ({id}) => { - return apiService.fetchFollowers({id, credentials}) + const fetchFollowers = ({id, page}) => { + return apiService.fetchFollowers({id, page, credentials}) } const fetchAllFollowing = ({username}) => { diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index fa955ad6..97b0d16f 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -113,6 +113,8 @@ export const parseUser = (data) => { output.locked = data.locked output.followers_count = data.followers_count output.statuses_count = data.statuses_count + output.friends = [] + output.followers = [] return output } -- cgit v1.2.3-70-g09d2 From dbb16d56e29b8a32fb7c1a7af56a7953f571cdb4 Mon Sep 17 00:00:00 2001 From: shpuld Date: Sat, 2 Feb 2019 22:29:10 +0200 Subject: follows/followers pagination ready for review --- src/components/followers_list/followers_list.js | 61 +++++++++++++++++ src/components/followers_list/followers_list.vue | 12 ++++ src/components/friends_list/friends_list.js | 61 +++++++++++++++++ src/components/friends_list/friends_list.vue | 12 ++++ src/components/user_card/user_card.vue | 4 +- src/components/user_profile/user_profile.js | 76 +++++++--------------- src/components/user_profile/user_profile.vue | 9 +-- src/modules/users.js | 66 +++++++++++++++---- .../user_profile_link_generator.js | 2 +- 9 files changed, 228 insertions(+), 75 deletions(-) create mode 100644 src/components/followers_list/followers_list.js create mode 100644 src/components/followers_list/followers_list.vue create mode 100644 src/components/friends_list/friends_list.js create mode 100644 src/components/friends_list/friends_list.vue (limited to 'src/services') diff --git a/src/components/followers_list/followers_list.js b/src/components/followers_list/followers_list.js new file mode 100644 index 00000000..13aace18 --- /dev/null +++ b/src/components/followers_list/followers_list.js @@ -0,0 +1,61 @@ +import UserCard from '../user_card/user_card.vue' + +const FollowersList = { + data () { + return { + loading: false, + bottomedOut: false, + error: false + } + }, + props: ['userId'], + created () { + window.addEventListener('scroll', this.scrollLoad) + if (this.user.followers.length === 0) { + this.fetchFollowers() + } + }, + destroyed () { + window.removeEventListener('scroll', this.scrollLoad) + this.$store.dispatch('clearFriendsAndFollowers', this.userId) + }, + computed: { + user () { + return this.$store.getters.userById(this.userId) + }, + followers () { + return this.user.followers + } + }, + methods: { + fetchFollowers () { + if (!this.loading) { + this.loading = true + this.$store.dispatch('addFollowers', this.userId).then(followers => { + this.error = false + this.loading = false + this.bottomedOut = followers.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.fetchFollowers() + } + } + }, + components: { + UserCard + } +} + +export default FollowersList diff --git a/src/components/followers_list/followers_list.vue b/src/components/followers_list/followers_list.vue new file mode 100644 index 00000000..b6bd35e1 --- /dev/null +++ b/src/components/followers_list/followers_list.vue @@ -0,0 +1,12 @@ + + +