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 @@ +
+ post image + +

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; }