diff --git a/src/app/components/feed/feed.component.html b/src/app/components/feed/feed.component.html
index 47b1ed2..fca185c 100644
--- a/src/app/components/feed/feed.component.html
+++ b/src/app/components/feed/feed.component.html
@@ -11,7 +11,6 @@
diff --git a/src/app/components/feed/feed.component.ts b/src/app/components/feed/feed.component.ts
index a99eea9..d226149 100644
--- a/src/app/components/feed/feed.component.ts
+++ b/src/app/components/feed/feed.component.ts
@@ -70,10 +70,13 @@ export class FeedComponent implements OnInit {
*/
createPost(postElement, activityId: string) {
if (postElement && activityId && this.checked) {
- this.feedService.createPostActivity(postElement.value, activityId).subscribe(() => {
+ this.feedService.createPostActivity(postElement.value, activityId, this.file).subscribe(() => {
postElement.value = '';
this.textInputValue = '';
this.checked = false;
+ this.file = null;
+ this.localFileUrl = null;
+ this.fileType = null;
if (this.view !== 'new') {
this.showNew();
}
@@ -82,10 +85,13 @@ export class FeedComponent implements OnInit {
this.errorMessage = error.error.errors[0].message;
});
} else if (postElement) {
- this.feedService.createPost(postElement.value).subscribe(() => {
+ this.feedService.createPost(postElement.value, this.file).subscribe(() => {
postElement.value = '';
this.textInputValue = '';
this.checked = false;
+ this.file = null;
+ this.localFileUrl = null;
+ this.fileType = null;
if (this.view !== 'new') {
this.showNew();
}
diff --git a/src/app/components/feed/postlist/postlist.component.html b/src/app/components/feed/postlist/postlist.component.html
index a323d42..50f13eb 100644
--- a/src/app/components/feed/postlist/postlist.component.html
+++ b/src/app/components/feed/postlist/postlist.component.html
@@ -22,6 +22,12 @@
+
+
+
+
diff --git a/src/app/models/post.ts b/src/app/models/post.ts
index eb4cb67..3143140 100644
--- a/src/app/models/post.ts
+++ b/src/app/models/post.ts
@@ -12,6 +12,8 @@ export class Post {
deletable: boolean;
author: Author;
activity: Activity;
+ mediaUrl: string;
+ mediaType: 'VIDEO' | 'IMAGE';
constructor(
id: number,
@@ -23,7 +25,8 @@ export class Post {
deletable: boolean,
date: string,
author: Author,
- activity: Activity
+ activity: Activity,
+ media?: {url: string, type: 'VIDEO' | 'IMAGE'},
) {
this.id = id;
this.content = content;
@@ -35,5 +38,9 @@ export class Post {
this.date = date;
this.author = author;
this.activity = activity;
+ if (media) {
+ this.mediaUrl = media.url;
+ this.mediaType = media.type;
+ }
}
}
diff --git a/src/app/services/feed/feed.service.ts b/src/app/services/feed/feed.service.ts
index 1689b91..3c924fd 100644
--- a/src/app/services/feed/feed.service.ts
+++ b/src/app/services/feed/feed.service.ts
@@ -4,10 +4,11 @@ import {Post} from 'src/app/models/post';
import {Author} from 'src/app/models/author';
import {environment} from 'src/environments/environment';
import {Activity} from 'src/app/models/activity';
-import {BehaviorSubject} from 'rxjs';
+import {BehaviorSubject, Observable} from 'rxjs';
import {tap} from 'rxjs/operators';
import {BaseService} from '../base.service';
import {formatDate} from '@angular/common';
+import {IFileUploadResult} from '../../models/interfaces/IFileUploadResult';
const createPostGqlQuery = `mutation($content: String!) {
createPost(content: $content) {
@@ -18,6 +19,7 @@ const createPostGqlQuery = `mutation($content: String!) {
downvotes,
userVote,
deletable,
+ media {url, type},
activity{
id
name
@@ -41,6 +43,7 @@ const createPostActivityGqlQuery = `mutation($content: String!, $id: ID) {
downvotes,
userVote,
deletable,
+ media {url, type},
activity{
id
name
@@ -76,6 +79,7 @@ const getPostGqlQuery = `query($first: Int, $offset: Int, $sort: SortType){
downvotes,
userVote,
deletable,
+ media {url, type},
activity{
id
name
@@ -138,47 +142,74 @@ export class FeedService extends BaseService {
/**
* Creates a new post
* @param pContent
+ * @param file
*/
- public createPost(pContent: String) {
+ public createPost(pContent: String, file?: File) {
const body = {
query: createPostGqlQuery,
variables: {
content: pContent
}
};
- return this.createPostRequest(body);
+ return this.createPostRequest(body, file);
}
/**
* Creates a post with an activity
* @param pContent
* @param activityId
+ * @param file
*/
- public createPostActivity(pContent: String, activityId: String) {
+ public createPostActivity(pContent: String, activityId: String, file?: File) {
const body = {
query: createPostActivityGqlQuery, variables: {
content: pContent,
id: activityId
}
};
- return this.createPostRequest(body);
+ return this.createPostRequest(body, file);
}
/**
* Creates a new post with a given request.
* @param body
+ * @param file - a file that is being uploaded with the post
*/
- private createPostRequest(body: { variables: any; query: string }) {
+ private createPostRequest(body: { variables: any; query: string }, file?: File) {
return this.postGraphql(body, null, 0)
.pipe(tap(response => {
if (this.activePostList === Sort.NEW) {
const updatedPosts = this.posts.getValue();
- updatedPosts.unshift(this.constructPost(response));
- this.posts.next(updatedPosts);
+ const post = this.constructPost(response);
+ updatedPosts.unshift(post);
+ if (file) {
+ this.uploadPostImage(post.id, file).subscribe((result) => {
+ post.mediaUrl = result.fileName;
+ post.mediaType = result.fileName.endsWith('.png') ? 'IMAGE' : 'VIDEO';
+ this.posts.next(updatedPosts);
+ }, error => {
+ console.error(error);
+ this.deletePost(post.id);
+ });
+ } else {
+ this.posts.next(updatedPosts);
+ }
}
}));
}
+ /**
+ * Uploads a file for a post
+ * @param postId
+ * @param file
+ */
+ private uploadPostImage(postId: number, file: File): Observable {
+ const formData = new FormData();
+ formData.append('postMedia', file);
+ formData.append('postId', postId.toString());
+ return this.post(environment.greenvironmentUrl + '/upload', formData, null, 0);
+ }
+
/**
* Upvotes a post
* @param postId
@@ -300,7 +331,8 @@ export class FeedService extends BaseService {
post.deletable,
date,
author,
- activity);
+ activity,
+ post.media);
}
public constructAllPosts(response: any): Post[] {
@@ -340,7 +372,8 @@ export class FeedService extends BaseService {
post.deletable,
date,
author,
- activity));
+ activity,
+ post.media));
}
return posts;
}