Merge branch 'niklas_dev2' of Software_Engineering_I/greenvironment-frontend into master
commit
9f9b4e9f70
@ -0,0 +1,15 @@
|
||||
<div id="contacts">
|
||||
<div id='header'>
|
||||
<button id="goback" (click)="goBack()"><span><i class="fa fa-arrow-left fa-3x" aria-hidden="true"></i></span></button>
|
||||
<span class='title'>Contacts</span>
|
||||
</div>
|
||||
<div class="search-container">
|
||||
</div>
|
||||
<div class="data-container">
|
||||
<div class="contact-item" *ngFor="let contact of contactList"
|
||||
[class.selected]="contact === selectedContact" (click)="createChat(contact.id)">
|
||||
<div class="picture">Pic</div>
|
||||
<div class="name"><span>{{contact.name}}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,25 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { ChatcontactsComponent } from './chatcontacts.component';
|
||||
|
||||
describe('ChatcontactsComponent', () => {
|
||||
let component: ChatcontactsComponent;
|
||||
let fixture: ComponentFixture<ChatcontactsComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ ChatcontactsComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(ChatcontactsComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
@ -0,0 +1,30 @@
|
||||
import { Component, OnInit, Output, EventEmitter } from '@angular/core';
|
||||
import { FriendInfo } from 'src/app/models/friendinfo';
|
||||
import { ChatService } from 'src/app/services/chat/chat.service';
|
||||
|
||||
@Component({
|
||||
selector: 'chatmanager-chatcontacts',
|
||||
templateUrl: './chatcontacts.component.html',
|
||||
styleUrls: ['./chatcontacts.component.sass']
|
||||
})
|
||||
export class ChatcontactsComponent implements OnInit {
|
||||
|
||||
@Output() goBackEvent = new EventEmitter<boolean>();
|
||||
selectedContact: FriendInfo
|
||||
|
||||
constructor(private chatService: ChatService) { }
|
||||
|
||||
ngOnInit() {
|
||||
}
|
||||
|
||||
goBack() {
|
||||
this.goBackEvent.emit(true)
|
||||
}
|
||||
|
||||
createChat(pFriendInfo: FriendInfo) {
|
||||
this.selectedContact = pFriendInfo
|
||||
this.chatService.createNewChat(pFriendInfo.id)
|
||||
this.goBack()
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,9 @@
|
||||
<div *ngIf="showChatlist">
|
||||
<chatmanager-chatlist (showChatEvent)="showSpecialChat($event)"></chatmanager-chatlist>
|
||||
<chatmanager-chatlist (showChatEvent)="showSpecialChat($event)" (showCreateChatEvent)="showNewChat($event)"></chatmanager-chatlist>
|
||||
</div>
|
||||
<div *ngIf="showChat">
|
||||
<chatmanager-chat (goBackEvent)="goBackToChatlist($event)" [childChat]="parentSelectedChat"></chatmanager-chat>
|
||||
</div>
|
||||
<div *ngIf="showCreateNewChat">
|
||||
<chatmanager-chatcontacts (goBackEvent)="goBackToChatlist($event)"></chatmanager-chatcontacts>
|
||||
</div>
|
||||
|
@ -1,19 +1,20 @@
|
||||
<div class="feeditem" *ngFor = "let post of childPostList">
|
||||
<div class="feeditem" *ngFor = "let post of childPostList" [class.selected]="post === selectedPost">
|
||||
<div class="itemhead">
|
||||
<div class="usertag">
|
||||
<span class="title">{{post.username}}</span>
|
||||
<span class="handle"><a href="#">{{post.handle}}</a></span>
|
||||
<span class="title">{{post.author.name}}</span>
|
||||
<span class="handle"><a href="#">@{{post.author.handle}}</a></span>
|
||||
</div>
|
||||
<span class="date">{{post.date}}</span>
|
||||
</div>
|
||||
<div class="itembody">
|
||||
<div class='text'>
|
||||
<p>{{post.message}}</p>
|
||||
<p>{{post.content}}</p>
|
||||
</div>
|
||||
<div class="vote">
|
||||
<button id="down" type='submit'><span><i class="fa fa-thumbs-o-down fa-2x" aria-hidden="true"></i></span></button>
|
||||
<button id="up" type='submit'><span><i class="fa fa-thumbs-o-up fa-2x" aria-hidden="true"></i></span></button>
|
||||
<span id="votecounter"> Votes: {{post.votes}}</span>
|
||||
<button id="down" type='submit'><span><i class="fa fa-thumbs-o-down fa-2x" aria-hidden="true" (click)="voteDown(post)"></i></span></button>
|
||||
<button id="up" type='submit'><span><i class="fa fa-thumbs-o-up fa-2x" aria-hidden="true" (click)="voteUp(post)"></i></span></button>
|
||||
<span id="downvotes">{{post.downvotes}}</span>
|
||||
<span id="upvotes">{{post.upvotes}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,11 @@
|
||||
export class Author {
|
||||
id: number
|
||||
name: string
|
||||
handle: string
|
||||
|
||||
constructor(pId: number, pName: string, pHandle: string) {
|
||||
this.id = pId
|
||||
this.name = pName
|
||||
this.handle = pHandle
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
import { Chatmessage } from "./chatmessage"
|
||||
|
||||
export class Chat {
|
||||
id: number
|
||||
memberID: number
|
||||
memberName: string
|
||||
messages: Array<Chatmessage>
|
||||
|
||||
|
||||
constructor(pId: number, pMemberID: number, pMemberName: string, pMessages: Array<Chatmessage>) {
|
||||
this.id = pId
|
||||
this.memberID = pMemberID
|
||||
this.memberName = pMemberName
|
||||
this.messages = pMessages
|
||||
}
|
||||
}
|
@ -1,9 +1,11 @@
|
||||
export class Chatmessage {
|
||||
content: string;
|
||||
myself: boolean;
|
||||
content: string
|
||||
date: string
|
||||
myself: boolean
|
||||
|
||||
constructor(pContent: string, pMyself: boolean) {
|
||||
constructor(pContent: string, pDate: string, pMyself: boolean) {
|
||||
this.content = pContent
|
||||
this.date = pDate
|
||||
this.myself = pMyself
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
export class FriendInfo {
|
||||
id: number
|
||||
name: string
|
||||
|
||||
constructor(pId: number, pName: string) {
|
||||
this.id = pId
|
||||
this.name = pName
|
||||
}
|
||||
}
|
@ -1,17 +1,19 @@
|
||||
import { Author } from "./author"
|
||||
|
||||
export class Post {
|
||||
id: string
|
||||
username: string
|
||||
handle: string
|
||||
message: string
|
||||
id: number
|
||||
content: string
|
||||
date: string
|
||||
votes: number
|
||||
upvotes: number
|
||||
downvotes: number
|
||||
author: Author
|
||||
|
||||
constructor(pId: string, pUsername: string, pHandle: string, pMessage: string, pDate: string, pVotes: number) {
|
||||
constructor(pId: number, pContent: string, pUpvotes: number, pDownvotes: number, pDate: string, pAuthor: Author) {
|
||||
this.id = pId
|
||||
this.username = pUsername
|
||||
this.handle = pHandle
|
||||
this.message = pMessage
|
||||
this.content = pContent
|
||||
this.upvotes = pUpvotes
|
||||
this.downvotes = pDownvotes
|
||||
this.date = pDate
|
||||
this.votes = pVotes
|
||||
this.author = pAuthor
|
||||
}
|
||||
}
|
@ -1,59 +1,143 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import {Http, URLSearchParams, Headers} from '@angular/http';
|
||||
import {Apollo} from 'apollo-angular';
|
||||
import gql from 'graphql-tag';
|
||||
import { Chat } from 'src/app/models/chat';
|
||||
import { responsePathAsArray } from 'graphql';
|
||||
import { Chatmessage } from 'src/app/models/chatmessage';
|
||||
import { FriendInfo } from 'src/app/models/friendinfo';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class ChatService {
|
||||
|
||||
name: any
|
||||
arr: number[]
|
||||
ownID: number
|
||||
chats: Array<Chat>
|
||||
|
||||
rates: any[];
|
||||
loading = true;
|
||||
error: any;
|
||||
constructor(private http: Http) { }
|
||||
|
||||
constructor(private apollo: Apollo) { }
|
||||
public getAllChats(): Array<Chat> {
|
||||
let url = 'https://greenvironment.net/graphql'
|
||||
|
||||
public getSelfName2() {
|
||||
this.apollo
|
||||
.watchQuery<any>({
|
||||
query: gql`
|
||||
{
|
||||
getSelf {
|
||||
name
|
||||
}
|
||||
}
|
||||
`,
|
||||
let headers = new Headers()
|
||||
headers.set('Content-Type', 'application/json')
|
||||
|
||||
this.http.post(url, this.getBodyForGetAllChats())
|
||||
.subscribe(response => {
|
||||
this.chats = this.updateAllChats(response.json())
|
||||
});
|
||||
return this.chats
|
||||
}
|
||||
|
||||
public createNewChat(pUserID: number) {
|
||||
let url = 'https://greenvironment.net/graphql'
|
||||
|
||||
let headers = new Headers()
|
||||
headers.set('Content-Type', 'application/json')
|
||||
|
||||
this.http.post(url, this.getBodyForNewChat(pUserID))
|
||||
}
|
||||
|
||||
public requestAllChatPartners(): Array<FriendInfo> {
|
||||
let url = 'https://greenvironment.net/graphql'
|
||||
let chatPartners: Array<FriendInfo>
|
||||
let temp
|
||||
|
||||
let headers = new Headers()
|
||||
headers.set('Content-Type', 'application/json')
|
||||
|
||||
this.http.post(url, this.getBodyForRequestOfAllChatPartners())
|
||||
.subscribe(response => {
|
||||
temp = response.json()
|
||||
})
|
||||
.valueChanges.subscribe(result => {
|
||||
this.name = result.data && result.data.name;
|
||||
this.loading = result.loading;
|
||||
this.error = result.errors;
|
||||
});
|
||||
|
||||
console.log(this.name)
|
||||
}
|
||||
|
||||
public getSelfName() {
|
||||
this.apollo
|
||||
.query<any>({
|
||||
query: gql`
|
||||
{
|
||||
rates(currency: "USD") {
|
||||
currency
|
||||
rate
|
||||
}
|
||||
|
||||
for(let chat of temp.data.getSelf.chats) {
|
||||
let memberID: number
|
||||
let memberName: string
|
||||
for(let member of chat.members) {
|
||||
if(member.id != this.ownID) {
|
||||
memberID = member.id
|
||||
memberName = member.name
|
||||
}
|
||||
`,
|
||||
})
|
||||
.subscribe(result => {
|
||||
this.rates = result.data && result.data.rates;
|
||||
this.loading = result.loading;
|
||||
this.error = result.errors;
|
||||
});
|
||||
}
|
||||
chatPartners.push(new FriendInfo(memberID, memberName))
|
||||
}
|
||||
|
||||
return chatPartners
|
||||
}
|
||||
|
||||
public sendMessage(pChatID: number, pContent: string) {
|
||||
let url = 'https://greenvironment.net/graphql'
|
||||
|
||||
let headers = new Headers()
|
||||
headers.set('Content-Type', 'application/json')
|
||||
|
||||
console.log(this.rates)
|
||||
this.http.post(url, this.getBodyForSendMessage(pChatID, pContent))
|
||||
}
|
||||
|
||||
updateAllChats(pResponse: any): Array<Chat> {
|
||||
let chats: Array<Chat>
|
||||
for(let chat of pResponse.data.getSelf.chats) {
|
||||
let memberID: number
|
||||
let memberName: string
|
||||
for(let member of chat.members) {
|
||||
if(member.id != this.ownID) {
|
||||
memberID = member.id
|
||||
memberName = member.name
|
||||
}
|
||||
}
|
||||
let messages: Array<Chatmessage>
|
||||
for(let message of chat.messages) {
|
||||
if(message.author.id == this.ownID) {
|
||||
messages.push(new Chatmessage(message.content, message.createdAt, true))
|
||||
} else {
|
||||
messages.push(new Chatmessage(message.content, message.createdAt, false))
|
||||
}
|
||||
}
|
||||
chats.push(new Chat(chat.id, memberID, memberName, messages))
|
||||
}
|
||||
return chats
|
||||
}
|
||||
|
||||
getBodyForNewChat(pUserID: number) {
|
||||
this.arr = [pUserID]
|
||||
const body = {query: `mutation($userID: number[]) {
|
||||
createChat(members: $userID) {id}
|
||||
}`, variables: {
|
||||
members: this.arr
|
||||
}};
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
getBodyForRequestOfAllChatPartners() {
|
||||
const body = {query: `query {
|
||||
getSelf {
|
||||
chats(first: 1000, offset: 0) {members{name, id}}
|
||||
}}`
|
||||
}
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
getBodyForSendMessage(pchatID: number, pContent: string) {
|
||||
const body = {query: `mutation($chatID: number, $content: string) {
|
||||
sendMessage(chatId: $chatID, content: $content) {id}
|
||||
}`, variables: {
|
||||
chatId: pchatID,
|
||||
content: pContent
|
||||
}};
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
getBodyForGetAllChats() {
|
||||
const body = {query: `query {
|
||||
getSelf {
|
||||
chats(first: 1000, offset: 0) {id, members{name, id},
|
||||
messages(first: 1000, offset: 0) {author {id}, createdAt, content}}
|
||||
}
|
||||
}`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,12 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
|
||||
import { FeedService } from './feed.service';
|
||||
|
||||
describe('FeedService', () => {
|
||||
beforeEach(() => TestBed.configureTestingModule({}));
|
||||
|
||||
it('should be created', () => {
|
||||
const service: FeedService = TestBed.get(FeedService);
|
||||
expect(service).toBeTruthy();
|
||||
});
|
||||
});
|
@ -0,0 +1,81 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Http } from '@angular/http';
|
||||
import { Post } from 'src/app/models/post';
|
||||
import { Author } from 'src/app/models/author';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class FeedService {
|
||||
|
||||
posts: Array<Post>
|
||||
|
||||
constructor(private http: Http) { }
|
||||
|
||||
public voteUp(pPostID: number): void {
|
||||
let url = 'https://greenvironment.net/graphql'
|
||||
|
||||
let headers = new Headers()
|
||||
headers.set('Content-Type', 'application/json')
|
||||
|
||||
const body = {query: `mutation($postId: number) {
|
||||
vote(postId: $postId, type: UPVOTE)
|
||||
}`, variables: {
|
||||
postId: pPostID
|
||||
}}
|
||||
|
||||
this.http.post(url, body)
|
||||
}
|
||||
|
||||
public voteDown(pPostID: number): void {
|
||||
let url = 'https://greenvironment.net/graphql'
|
||||
|
||||
let headers = new Headers()
|
||||
headers.set('Content-Type', 'application/json')
|
||||
|
||||
const body = {query: `mutation($postId: number) {
|
||||
vote(postId: $postId, type: DOWNVOTE)
|
||||
}`, variables: {
|
||||
postId: pPostID
|
||||
}}
|
||||
|
||||
this.http.post(url, body)
|
||||
}
|
||||
|
||||
public getAllPosts(): Array<Post> {
|
||||
let url = 'https://greenvironment.net/graphql'
|
||||
|
||||
let headers = new Headers()
|
||||
headers.set('Content-Type', 'application/json')
|
||||
|
||||
this.http.post(url, this.getBodyForGetAllChats())
|
||||
.subscribe(response => {
|
||||
this.posts = this.renderAllPosts(response.json())
|
||||
});
|
||||
return this.posts
|
||||
}
|
||||
|
||||
getBodyForGetAllChats() {
|
||||
const body = {query: `query {
|
||||
getPosts (first: 1000, offset: 0) {id, content, upvotes, downvotes, author{name, handle, id}, createdAt}
|
||||
}`
|
||||
}
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
renderAllPosts(pResponse: any): Array<Post> {
|
||||
let posts = new Array<Post>()
|
||||
for(let post of pResponse.data.getPosts) {
|
||||
let id: number = post.id
|
||||
let content: string = post.content
|
||||
let upvotes: number = post.upvotes
|
||||
let downvotes: number = post.downvotes
|
||||
let author = new Author(post.author.id, post.author.name, post.author.handle)
|
||||
let date = post.createdAt
|
||||
|
||||
posts.push(new Post(id, content, upvotes, downvotes, date, author))
|
||||
}
|
||||
return posts
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue