Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // memberservice.ts
- import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
- import { Injectable } from '@angular/core';
- import { environment } from 'src/environments/environment';
- import { Member } from '../_models/member.model';
- import { filter, map, of, take } from 'rxjs';
- import { PaginatedResult } from '../_models/pagination';
- import { UserParams } from '../_models/userParams';
- import { AccountService } from './account.service';
- import { User } from '../_models/user.model';
- @Injectable({
- providedIn: 'root'
- })
- export class MembersService {
- baseUrl = environment.apiUrl;
- members: Member[] = [];
- memberCache = new Map();
- user: User | undefined;
- userParams: UserParams | undefined;
- constructor(private http: HttpClient, private accountService: AccountService) {
- this.accountService.currentUser$.pipe(
- filter(user => !!user),
- take(1)
- ).subscribe({
- next: user => {
- console.log(user);
- if (user) {
- this.userParams = new UserParams(user);
- this.user = user;
- }
- }
- })
- }
- getUserParams() {
- return this.userParams;
- }
- setUserParams(userParams: UserParams) {
- this.userParams = userParams;
- }
- resetUserParams() {
- if (this.user) {
- this.userParams = new UserParams(this.user);
- return this.userParams;
- }
- return;
- }
- getMembers(userParams: UserParams) {
- const response = this.memberCache.get(Object.values(userParams).join('-'));
- if (response) return of(response);
- let params = this.getPaginationHeaders(userParams.pageNumber, userParams.pageSize);
- params = params.append('minAge', userParams.minAge);
- params = params.append('maxAge', userParams.maxAge);
- params = params.append('gender', userParams.gender);
- params = params.append('orderBy', userParams.orderBy);
- return this.getPaginatedResult<Member[]>(this.baseUrl + 'users', params).pipe(
- map(response => {
- this.memberCache.set(Object.values(userParams).join('-'), response);
- return response;
- })
- );
- }
- getMember(username: string) {
- const member = [...this.memberCache.values()]
- .reduce((arr, elem) => arr.concat(elem.result), [])
- .find((member: Member) => member.username == username);
- if (member) {
- return of(member);
- }
- return this.http.get<Member>(this.baseUrl + 'users/' + username);
- }
- updateMember(member: Member) {
- return this.http.put(this.baseUrl + 'users', member);
- }
- setMainPhoto(photoId: number) {
- return this.http.put(this.baseUrl + 'users/set-main-photo/' + photoId, {})
- }
- deletePhoto(photoId: number) {
- return this.http.delete(this.baseUrl + 'users/delete-photo/' + photoId);
- }
- addLike(username: string) {
- return this.http.post(this.baseUrl + 'likes/' + username, {});
- }
- getLikes(predicate: string, pageNumber: number, pageSize: number) {
- let params = this.getPaginationHeaders(pageNumber, pageSize);
- params = params.append('predicate', predicate);
- return this.getPaginatedResult<Member[]>(this.baseUrl + 'likes', params);
- }
- private getPaginatedResult<T>(url: string, params: HttpParams) {
- const paginatedResult: PaginatedResult<T> = new PaginatedResult<T>;
- return this.http.get<T>(url, { observe: 'response', params }).pipe(
- map(response => {
- if (response.body) {
- paginatedResult.result = response.body;
- }
- const pagination = response.headers.get('Pagination');
- if (pagination) {
- paginatedResult.pagination = JSON.parse(pagination);
- }
- return paginatedResult;
- })
- );
- }
- private getPaginationHeaders(pageNumber: number, pageSize: number) {
- let params = new HttpParams();
- params = params.append('pageNumber', pageNumber);
- params = params.append('pageSize', pageSize);
- return params;
- }
- }
- //listComponent.html
- <div class="text-center mt-3">
- <h2>{{predicate==='liked'?'Members I like':'Members who like me'}}</h2>
- </div>
- <div class="container mt-3">
- <div class="d-flex">
- <div class="btn-group" name="predicate">
- <button class="btn btn-primary" btnRadio="liked" [(ngModel)]="predicate" (click)="loadLikes()">Members I
- like</button>
- <button class="btn btn-primary" btnRadio="likedBy" [(ngModel)]="predicate" (click)="loadLikes()">Members who
- like me</button>
- </div>
- </div>
- <div class="row mt-3">
- <div class="col-2" *ngFor="let member of members">
- <app-member-card [member]="member"></app-member-card>
- </div>
- </div>
- </div>
- <div class="d-flex justify-content-center" *ngIf="pagination && pagination.totalItems>0;else no_result_message">
- <pagination [boundaryLinks]="true" [totalItems]="pagination.totalItems" [itemsPerPage]="pagination.itemsPerPage"
- [maxSize]="10" [(ngModel)]="pagination.currentPage" (pageChanged)="pageChanged($event)" previousText="‹"
- nextText="›" firstText="«" lastText="»">
- </pagination>
- </div>
- <ng-template #no_result_message>
- <div class="container">
- <p>Opps... There is nothing here</p>
- </div>
- </ng-template>
- //listcomponent.ts
- import { Component, OnInit } from '@angular/core';
- import { Member } from '../_models/member.model';
- import { MembersService } from '../_services/members.service';
- import { Pagination } from '../_models/pagination';
- @Component({
- selector: 'app-lists',
- templateUrl: './lists.component.html',
- styleUrls: ['./lists.component.css']
- })
- export class ListsComponent implements OnInit {
- members: Member[] | undefined;
- predicate = 'liked';
- pageNumber = 1;
- pageSize = 5;
- pagination: Pagination | undefined;
- constructor(private memberService: MembersService) { }
- ngOnInit(): void {
- //this.loadLikes();
- }
- loadLikes() {
- this.memberService.getLikes(this.predicate, this.pageNumber, this.pageSize).subscribe({
- next: response => {
- this.members = response.result;
- this.pagination = response.pagination;
- }
- })
- }
- pageChanged(event: any) {
- if (this.pageNumber !== event.page) {
- this.pageNumber = event.page;
- this.loadLikes();
- }
- }
- }
- //membercard.html
- <div class="card mb-4" *ngIf="member">
- <div class="card-img-wrapper">
- <img src="{{member.photoUrl || './assets/user.png'}}" alt="{{member.knownAs}}" class="card-img-top">
- <ul class="list-inline member-icons animate text-center">
- <li class="list-inline-item">
- <button routerLink="/members/{{member.username}}" class="btn btn-primary"><i
- class="fa fa-user"></i></button>
- </li>
- <li class="list-inline-item">
- <button class="btn btn-primary"><i class="fa fa-heart"></i></button>
- </li>
- <li class="list-inline-item">
- <button class="btn btn-primary"><i class="fa fa-envelope"></i></button>
- </li>
- </ul>
- </div>
- <div class="card-body p-1">
- <h6 class="card-title text-center mb-1">
- <i class="fa fa-user me-2"></i>
- {{member.knownAs}}, {{member.age}}
- </h6>
- <p class="card-text text-muted text-center">{{member.city}}</p>
- </div>
- </div>
- //member card .ts
- import { Component, Input } from '@angular/core';
- import { ToastrService } from 'ngx-toastr';
- import { Member } from 'src/app/_models/member.model';
- import { MembersService } from 'src/app/_services/members.service';
- @Component({
- selector: 'app-member-card',
- templateUrl: './member-card.component.html',
- styleUrls: ['./member-card.component.css']
- })
- export class MemberCardComponent {
- @Input() member: Member | undefined;
- constructor(private memberService: MembersService, private toastr: ToastrService) { }
- addLike(member: Member) {
- this.memberService.addLike(member.username).subscribe({
- next: () => this.toastr.success('You have liked ' + member.knownAs)
- })
- }
- }
- //nav.component.ts
- //import { Component, OnInit } from '@angular/core';
- import { AccountService } from '../_services/account.service';
- import { Router } from '@angular/router';
- import { ToastrService } from 'ngx-toastr';
- import { take } from 'rxjs';
- import { MembersService } from '../_services/members.service';
- @Component({
- selector: 'app-nav',
- templateUrl: './nav.component.html',
- styleUrls: ['./nav.component.css']
- })
- export class NavComponent implements OnInit {
- model: any = {}
- constructor(public accountService: AccountService, private router: Router, private toastr: ToastrService,
- private memberService: MembersService) { }
- ngOnInit(): void {
- this.accountService.currentUser$.pipe(take(1)).subscribe({
- //next: user => console.log(user)
- })
- }
- login() {
- this.accountService.login(this.model).subscribe({
- next: () => {
- this.router.navigateByUrl('/members');
- }
- })
- }
- logout() {
- this.accountService.logout();
- this.router.navigateByUrl('/');
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment