requests are disabled if the user already received a request

master
Max 5 years ago
parent d94f3a921b
commit 8f8b95c5bd

@ -45,6 +45,7 @@ import { OverlayModule} from '@angular/cdk/overlay';
import {MatSlideToggleModule} from '@angular/material/slide-toggle'; import {MatSlideToggleModule} from '@angular/material/slide-toggle';
import {MatMenuModule} from '@angular/material/menu'; import {MatMenuModule} from '@angular/material/menu';
import {MatRippleModule} from '@angular/material/core'; import {MatRippleModule} from '@angular/material/core';
import {MatBadgeModule} from '@angular/material/badge';
import { FlexLayoutModule } from '@angular/flex-layout'; import { FlexLayoutModule } from '@angular/flex-layout';
import { MainNavigationComponent } from './components/main-navigation/main-navigation.component'; import { MainNavigationComponent } from './components/main-navigation/main-navigation.component';
@ -122,7 +123,8 @@ const appRoutes: Routes = [
MatMenuModule, MatMenuModule,
MatRippleModule, MatRippleModule,
MatTableModule, MatTableModule,
MatSortModule MatSortModule,
MatBadgeModule
], ],
providers: [], providers: [],
bootstrap: [AppComponent] bootstrap: [AppComponent]

@ -57,21 +57,23 @@
</nav> </nav>
<div id="menu-button-box"> <div id="menu-button-box">
<button mat-icon-button [matMenuTriggerFor]="requestMenu" [disabled]="!loggedIn" id="menu-button"> <button mat-icon-button [matMenuTriggerFor]="requestMenu" [disabled]="!loggedIn" id="menu-button">
<mat-icon >notifications</mat-icon> <mat-icon [matBadge]="user.receivedRequests.length" matBadgeColor="accent">notifications</mat-icon>
</button> </button>
<button mat-icon-button [matMenuTriggerFor]="menu" id="menu-button"> <button mat-icon-button [matMenuTriggerFor]="menu" id="menu-button">
<mat-icon>more_vert</mat-icon> <mat-icon>more_vert</mat-icon>
</button> </button>
</div> </div>
<mat-menu #requestMenu="matMenu"> <mat-menu #requestMenu="matMenu">
<button mat-menu-item (click)="$event.stopPropagation();"> <span mat-menu-item disableRipple="true" disabled="true">friend requests:</span>
<button mat-icon-button> <button mat-menu-item *ngFor = "let request of user.receivedRequests" [class.selected]="request === selectedRequest" (click)="$event.stopPropagation();" disableRipple="true">
<button mat-icon-button (click)=acceptRequest(request.id)>
<mat-icon>check</mat-icon> <mat-icon>check</mat-icon>
</button> </button>
<button mat-icon-button> <button mat-icon-button (click)=denyRequest(request.id)>
<mat-icon>close</mat-icon> <mat-icon>close</mat-icon>
</button> </button>
<span>request</span> <span>{{request.senderUsername}}</span>
<span>&nbsp; @{{request.senderHandle}}</span>
</button> </button>
</mat-menu> </mat-menu>
<mat-menu #menu="matMenu"> <mat-menu #menu="matMenu">

@ -26,7 +26,6 @@
.mat-tab-link .mat-tab-link
height: 56px height: 56px
#link-box #link-box
padding: 0.5em padding: 0.5em

@ -102,11 +102,9 @@ export class MainNavigationComponent implements OnInit {
const headers = new Headers(); const headers = new Headers();
headers.set('Content-Type', 'application/json'); headers.set('Content-Type', 'application/json');
const body = {query: `mutation { const body = {query: `mutation {
logout logout
}`}; }`};
this.http.post(url, body).subscribe(response => { this.http.post(url, body).subscribe(response => {
console.log(response.text()); }); console.log(response.text()); });
this.loggedIn = false; this.loggedIn = false;
@ -115,4 +113,11 @@ export class MainNavigationComponent implements OnInit {
this.data.changeUserInfo(user); this.data.changeUserInfo(user);
this.router.navigate(['login']); this.router.navigate(['login']);
} }
acceptRequest(id: number) {
console.log('accept request with id: ' + id);
}
denyRequest(id: number) {
console.log('deny request with id: ' + id);
}
} }

@ -32,7 +32,7 @@
<mat-card-title class="pointer" (click)="showUserProfile(user)">{{user.username}}</mat-card-title> <mat-card-title class="pointer" (click)="showUserProfile(user)">{{user.username}}</mat-card-title>
<mat-card-subtitle class="pointer" (click)="showUserProfile(user)">{{user.handle}}</mat-card-subtitle> <mat-card-subtitle class="pointer" (click)="showUserProfile(user)">{{user.handle}}</mat-card-subtitle>
<div class="icon-box"> <div class="icon-box">
<button mat-icon-button class="request-button" (click)="sendFriendRequest(user)"><mat-icon>person_add</mat-icon></button> <button mat-icon-button class="request-button" (click)="sendFriendRequest(user)" [disabled]="!user.allowedToSendRequest"><mat-icon>person_add</mat-icon></button>
</div> </div>
</mat-card-header> </mat-card-header>
</mat-card> </mat-card>

@ -5,6 +5,7 @@ import {Headers, Http} from '@angular/http';
import { User } from 'src/app/models/user'; import { User } from 'src/app/models/user';
import {environment} from 'src/environments/environment'; import {environment} from 'src/environments/environment';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { DatasharingService } from '../../services/datasharing.service';
@Component({ @Component({
selector: 'home-search', selector: 'home-search',
@ -14,14 +15,19 @@ import { Router } from '@angular/router';
export class SearchComponent implements OnInit { export class SearchComponent implements OnInit {
searchValue = ' '; searchValue = ' ';
category = 'user'; category = 'user';
user: User;
foundUsers: Array<User>; foundUsers: Array<User>;
constructor( constructor(
private searchService: SearchService, private searchService: SearchService,
private requestService: RequestService, private requestService: RequestService,
private http: Http, private http: Http,
private router: Router) { } private router: Router,
private data: DatasharingService) { }
ngOnInit() { ngOnInit() {
this.data.currentUserInfo.subscribe(user => {
this.user = user;
});
} }
changeCategory(value: string) { changeCategory(value: string) {
@ -47,9 +53,17 @@ export class SearchComponent implements OnInit {
headers.set('Content-Type', 'application/json'); headers.set('Content-Type', 'application/json');
this.http.post(environment.graphQLUrl, this.searchService.buildJsonUser(name)) this.http.post(environment.graphQLUrl, this.searchService.buildJsonUser(name))
.subscribe(response => { .subscribe(response => {
console.log('response received');
console.log(response);
this.foundUsers = this.searchService.renderUsers(response.json()); this.foundUsers = this.searchService.renderUsers(response.json());
for (const foundUser of this.foundUsers) {
if (!this.user.loggedIn) {foundUser.allowedToSendRequest = false; } else {
for (const receiverID of this.user.sentRequestUserIDs) {
if (foundUser.userID === receiverID ||
foundUser.userID === this.user.userID) {
foundUser.allowedToSendRequest = false;
}
}
}
}
}); });
} }
@ -58,12 +72,11 @@ export class SearchComponent implements OnInit {
} }
public sendFriendRequest(user: User) { public sendFriendRequest(user: User) {
user.allowedToSendRequest = false;
const headers = new Headers(); const headers = new Headers();
headers.set('Content-Type', 'application/json'); headers.set('Content-Type', 'application/json');
this.http.post(environment.graphQLUrl, this.requestService.buildJsonRequest(user.userID, 'FRIENDREQUEST')) this.http.post(environment.graphQLUrl, this.requestService.buildJsonRequest(user.userID, 'FRIENDREQUEST'))
.subscribe(response => { .subscribe(response => {
console.log('response received');
console.log(response);
}); });
} }
} }

@ -0,0 +1,8 @@
import { User } from 'src/app/models/user';
export class FriendRequest {
id: number;
senderUserID: number;
senderHandle: string;
senderUsername: string;
}

@ -1,5 +1,7 @@
import { FriendRequest } from 'src/app/models/friendRequest';
export class User { export class User {
loggedIn: boolean; loggedIn = false;
userID: number; userID: number;
username: string; username: string;
handle: string; handle: string;
@ -11,6 +13,8 @@ export class User {
friendIDs: number[]; friendIDs: number[];
groupIDs: number[]; groupIDs: number[];
chatIDs: number[]; chatIDs: number[];
receivedRequests: FriendRequest[] = new Array();
requestIDs: number[]; sentRequestUserIDs: number[] = new Array(); // IDs of users that already received requests of the logged in user
allowedToSendRequest = true; /* if a user already received a request this should
be false to avoid multiple invitations*/
} }

@ -15,6 +15,7 @@ export class DatasharingService {
constructor() { } constructor() { }
changeUserInfo(pUserInfo: User) { changeUserInfo(pUserInfo: User) {
console.log('DatasharingService: user info updated');
this.userInfoSource.next(pUserInfo); this.userInfoSource.next(pUserInfo);
} }

@ -1,10 +1,11 @@
import {Injectable} from '@angular/core'; import {Injectable} from '@angular/core';
import {Headers, Http} from '@angular/http'; import {Headers, Http, Request} from '@angular/http';
import {Login} from '../../models/login'; import {Login} from '../../models/login';
import {User} from 'src/app/models/user'; import {User} from 'src/app/models/user';
import {DatasharingService} from '../datasharing.service'; import {DatasharingService} from '../datasharing.service';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
import {environment} from 'src/environments/environment'; import {environment} from 'src/environments/environment';
import { FriendRequest } from 'src/app/models/friendRequest';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -35,6 +36,7 @@ export class LoginService {
public updateUserInfo(response: any) { public updateUserInfo(response: any) {
const user: User = new User(); const user: User = new User();
let friendRequest: FriendRequest = new FriendRequest();
user.loggedIn = true; user.loggedIn = true;
user.userID = response.data.login.id; user.userID = response.data.login.id;
user.username = response.data.login.name; user.username = response.data.login.name;
@ -45,10 +47,19 @@ export class LoginService {
user.friendIDs = response.data.login.friends; user.friendIDs = response.data.login.friends;
user.groupIDs = response.data.login.groups; user.groupIDs = response.data.login.groups;
user.chatIDs = response.data.login.chats; user.chatIDs = response.data.login.chats;
user.requestIDs = response.data.login.requests; for (const request of response.data.login.sentRequests) {
user.sentRequestUserIDs.push(request.receiver.id);
}
for (const request of response.data.login.receivedRequests) {
friendRequest = new FriendRequest();
friendRequest.id = request.id;
friendRequest.senderUserID = request.sender.id;
friendRequest.senderUsername = request.sender.name;
friendRequest.senderHandle = request.sender.handle;
user.receivedRequests.push(friendRequest);
}
console.log(user.receivedRequests);
this.data.changeUserInfo(user); this.data.changeUserInfo(user);
} }
public buildJson(login: Login): any { public buildJson(login: Login): any {
@ -61,6 +72,8 @@ export class LoginService {
handle, handle,
points, points,
level, level,
receivedRequests{id, sender{name, handle, id}},
sentRequests{receiver{id}},
friends { friends {
id id
}, },

@ -48,7 +48,9 @@ export class RegisterService {
user.friendIDs = response.data.register.friends; user.friendIDs = response.data.register.friends;
user.groupIDs = response.data.register.groups; user.groupIDs = response.data.register.groups;
user.chatIDs = response.data.register.chats; user.chatIDs = response.data.register.chats;
user.requestIDs = response.data.register.requests; for (const request of response.data.register.sentRequests) {
user.sentRequestUserIDs.push(request.receiver.id);
}
this.data.changeUserInfo(user); this.data.changeUserInfo(user);
@ -62,6 +64,7 @@ export class RegisterService {
handle, handle,
points, points,
level, level,
sentRequests{receiver{id}}
friends{id}, friends{id},
groups{id}, groups{id},
chats{id} chats{id}

@ -53,14 +53,16 @@ export class SelfService {
user.friendIDs = response.data.getSelf.friends; user.friendIDs = response.data.getSelf.friends;
user.groupIDs = response.data.getSelf.groups; user.groupIDs = response.data.getSelf.groups;
user.chatIDs = response.data.getSelf.chats; user.chatIDs = response.data.getSelf.chats;
user.requestIDs = response.data.getSelf.requests; for (const request of response.data.getSelf.sentRequests) {
user.sentRequestUserIDs.push(request.receiver.id);
}
this.data.changeUserInfo(user); this.data.changeUserInfo(user);
} }
public buildJson(): any { public buildJson(): any {
const body = {query: `{ const body = {query: `{
getSelf{id, name,email, handle, points, level, friends{id}, groups{id},chats{id}} getSelf{id, name, email, handle, points, level, sentRequests{receiver{id}}, friends{id}, groups{id},chats{id}}
}`, variables: { }`, variables: {
}}; }};
return body; return body;

@ -9,8 +9,8 @@
// Define the palettes for your theme using the Material Design palettes available in palette.scss // Define the palettes for your theme using the Material Design palettes available in palette.scss
// (imported above). For each palette, you can optionally specify a default, lighter, and darker // (imported above). For each palette, you can optionally specify a default, lighter, and darker
// hue. Available color palettes: https://material.io/design/color/ // hue. Available color palettes: https://material.io/design/color/
$primary: mat-palette($mat-green); $primary: mat-palette($mat-light-green);
$accent: mat-palette($mat-pink, A200, A100, A400); $accent: mat-palette($mat-brown, A200, A100, A400);
$background-color: map_get($mat-grey, 50); $background-color: map_get($mat-grey, 50);
// The warn palette is optional (defaults to red). // The warn palette is optional (defaults to red).
$warn: mat-palette($mat-red); $warn: mat-palette($mat-red);
@ -27,8 +27,8 @@ $light-theme: map_merge($light-theme, (background: $background));
$dark-primary: mat-palette($mat-green); $dark-primary: mat-palette($mat-light-green);
$dark-accent: mat-palette($mat-pink, A200, A100, A400); $dark-accent: mat-palette($mat-brown, A200, A100, A400);
// The warn palette is optional (defaults to red). // The warn palette is optional (defaults to red).
$dark-warn: mat-palette($mat-red); $dark-warn: mat-palette($mat-red);

Loading…
Cancel
Save