Skip to content

Commit dd7315d

Browse files
committed
Implement infinite scroll
1 parent db90fe2 commit dd7315d

File tree

4 files changed

+56
-17
lines changed

4 files changed

+56
-17
lines changed

frontend/src/components/common/TweetPreviewList.vue

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@
77
@click="onTweetClick"
88
/>
99
</template>
10+
<infinite-loading @infinite="infiniteHandler" ref="infiniteLoading" >
11+
<span slot="no-more" />
12+
</infinite-loading>
1013
</div>
1114
</template>
1215

1316
<script>
17+
import InfiniteLoading from 'vue-infinite-loading';
1418
import TweetPreview from './TweetPreview.vue';
1519
1620
export default {
@@ -20,17 +24,22 @@ export default {
2024
tweets: {
2125
type: Array,
2226
required: true
23-
}
27+
},
2428
},
2529
2630
components: {
2731
TweetPreview,
32+
InfiniteLoading,
2833
},
2934
3035
methods: {
3136
onTweetClick(tweet) {
3237
this.$router.push({ name: 'tweet-page', params: { id: tweet.id } });
3338
},
39+
40+
infiniteHandler($state) {
41+
this.$emit('infinite', $state);
42+
},
3443
},
3544
};
3645
</script>

frontend/src/components/view/feed/FeedContainer.vue

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
<NoContent :show="!tweets.length" title="No tweets yet :)" />
1818

19-
<TweetPreviewList :tweets="tweets" />
19+
<TweetPreviewList :tweets="tweets" @infinite="infiniteHandler" />
2020

2121
<b-modal :active.sync="isNewTweetModalActive" has-modal-card>
2222
<NewTweetForm />
@@ -46,6 +46,7 @@ export default {
4646
4747
data: () => ({
4848
isNewTweetModalActive: false,
49+
page: 1,
4950
}),
5051
5152
async created() {
@@ -84,6 +85,21 @@ export default {
8485
showAddTweetModal() {
8586
this.isNewTweetModalActive = true;
8687
},
88+
89+
async infiniteHandler($state) {
90+
try {
91+
const tweets = await this.fetchTweets({ page: this.page });
92+
93+
if (tweets.length) {
94+
this.page++;
95+
$state.loaded();
96+
} else {
97+
$state.complete();
98+
}
99+
} catch {
100+
$state.complete();
101+
}
102+
},
87103
},
88104
};
89105
</script>

frontend/src/components/view/user/UserContainer.vue

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div class="user-container">
3-
<TweetPreviewList :tweets="tweets" />
3+
<TweetPreviewList :tweets="tweets" @infinite="infiniteHandler" />
44
<NoContent :show="!tweets.length" title="No tweets yet :)" />
55
</div>
66
</template>
@@ -20,20 +20,35 @@ export default {
2020
2121
data: () => ({
2222
tweets: [],
23+
page: 1,
2324
}),
2425
25-
async created() {
26-
try {
27-
this.tweets = await this.fetchTweetsByUserId(this.$route.params.id);
28-
} catch (error) {
29-
console.error(error.message);
30-
}
31-
},
32-
3326
methods: {
3427
...mapActions('tweet', [
3528
'fetchTweetsByUserId',
3629
]),
30+
31+
async infiniteHandler($state) {
32+
try {
33+
const tweets = await this.fetchTweetsByUserId({
34+
userId: this.$route.params.id,
35+
params: {
36+
page: this.page
37+
}
38+
});
39+
40+
if (tweets.length) {
41+
this.tweets.push(...tweets);
42+
this.page++;
43+
$state.loaded();
44+
} else {
45+
$state.complete();
46+
}
47+
} catch (error) {
48+
console.error(error);
49+
$state.loaded();
50+
}
51+
},
3752
},
3853
};
3954
</script>

frontend/src/store/modules/tweet/actions.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,27 @@ import api from '@/api/Api';
99
import { tweetMapper } from '@/services/Normalizer';
1010

1111
export default {
12-
async fetchTweets({ commit }) {
12+
async fetchTweets({ commit }, params) {
1313
commit(SET_LOADING, true, { root: true });
1414

1515
try {
16-
const data = await api.get('/tweets');
16+
const data = await api.get('/tweets', params);
1717

1818
commit(SET_TWEETS, data);
1919
commit(SET_LOADING, false, { root: true });
2020

21-
return Promise.resolve();
21+
return Promise.resolve(data);
2222
} catch (error) {
2323
commit(SET_LOADING, false, { root: true });
2424

2525
return Promise.reject(error);
2626
}
2727
},
2828

29-
async fetchTweetsByUserId({ commit }, userId) {
29+
async fetchTweetsByUserId({ commit }, { userId, params }) {
3030
commit(SET_LOADING, true, { root: true });
31-
3231
try {
33-
const tweets = await api.get(`/users/${userId}/tweets`);
32+
const tweets = await api.get(`/users/${userId}/tweets`, params);
3433

3534
commit(SET_LOADING, false, { root: true });
3635

0 commit comments

Comments
 (0)