aboutsummaryrefslogtreecommitdiff
path: root/app/components/posts.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/components/posts.js')
-rw-r--r--app/components/posts.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/app/components/posts.js b/app/components/posts.js
new file mode 100644
index 0000000..d0e0338
--- /dev/null
+++ b/app/components/posts.js
@@ -0,0 +1,77 @@
+import Axios from 'axios';
+import Vue from 'vue';
+import AuthService from '../services/auth';
+
+import PostFormComponent from './post_form';
+import PostComponent from './post';
+import DatetimeFilter from '../filters/datetime';
+import UsertimeFilter from '../filters/usertime';
+
+const internals = {};
+
+internals.kPostsRoute = '/api/posts';
+internals.kPollFrequency = 5000;
+
+export default internals.PostsComponent = Vue.component('posts', {
+ template: '<div v-if="authService.authenticated" class="posts-container">' +
+ '<post-form v-on:post-submitted="addPost"></post-form>' +
+ '<h1>Posts.</h1>' +
+ '<p v-show="message" class="posts-error">{{message}}</p>' +
+ '<post v-for="post in posts" v-bind:post="post" :key="post.uuid"></post>' +
+ '</div>',
+
+ data() {
+
+ return {
+ message: '',
+ authService: new AuthService(),
+ posts: []
+ };
+ },
+
+ methods: {
+ fetchPosts() {
+
+ return Axios({
+ method: 'get',
+ headers: {
+ Authorization: `Bearer ${this.authService.token}`
+ },
+ url: internals.kPostsRoute
+ }).then((response) => {
+
+ this.posts = response.data;
+ if (!this._isBeingDestroyed) {
+ setTimeout(this.fetchPosts.bind(this), internals.kPollFrequency);
+ }
+ }).catch((err) => {
+
+ console.error(err.stack);
+ this.message = 'Error while loading the posts...';
+ });
+ },
+
+ addPost(post) {
+
+ this.posts.unshift(post);
+ }
+ },
+
+ components: {
+ postForm: PostFormComponent,
+ post: PostComponent,
+ datetime: DatetimeFilter,
+ usertime: UsertimeFilter
+ },
+
+ mounted() {
+
+ if (!this.authService.authenticated) {
+ return this.$router.push('/login');
+ }
+
+ this.fetchPosts();
+
+ }
+});
+