Slavik9510

Untitled

Mar 2nd, 2024
1,186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //  memberservice.ts
  2.  
  3. import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
  4. import { Injectable } from '@angular/core';
  5. import { environment } from 'src/environments/environment';
  6. import { Member } from '../_models/member.model';
  7. import { filter, map, of, take } from 'rxjs';
  8. import { PaginatedResult } from '../_models/pagination';
  9. import { UserParams } from '../_models/userParams';
  10. import { AccountService } from './account.service';
  11. import { User } from '../_models/user.model';
  12.  
  13. @Injectable({
  14.   providedIn: 'root'
  15. })
  16. export class MembersService {
  17.   baseUrl = environment.apiUrl;
  18.   members: Member[] = [];
  19.   memberCache = new Map();
  20.   user: User | undefined;
  21.   userParams: UserParams | undefined;
  22.  
  23.   constructor(private http: HttpClient, private accountService: AccountService) {
  24.     this.accountService.currentUser$.pipe(
  25.       filter(user => !!user),
  26.       take(1)
  27.     ).subscribe({
  28.       next: user => {
  29.         console.log(user);
  30.         if (user) {
  31.           this.userParams = new UserParams(user);
  32.           this.user = user;
  33.         }
  34.       }
  35.     })
  36.   }
  37.  
  38.   getUserParams() {
  39.     return this.userParams;
  40.   }
  41.  
  42.   setUserParams(userParams: UserParams) {
  43.     this.userParams = userParams;
  44.   }
  45.  
  46.   resetUserParams() {
  47.     if (this.user) {
  48.       this.userParams = new UserParams(this.user);
  49.       return this.userParams;
  50.     }
  51.     return;
  52.   }
  53.  
  54.   getMembers(userParams: UserParams) {
  55.     const response = this.memberCache.get(Object.values(userParams).join('-'));
  56.  
  57.     if (response) return of(response);
  58.  
  59.     let params = this.getPaginationHeaders(userParams.pageNumber, userParams.pageSize);
  60.  
  61.     params = params.append('minAge', userParams.minAge);
  62.     params = params.append('maxAge', userParams.maxAge);
  63.     params = params.append('gender', userParams.gender);
  64.     params = params.append('orderBy', userParams.orderBy);
  65.  
  66.     return this.getPaginatedResult<Member[]>(this.baseUrl + 'users', params).pipe(
  67.       map(response => {
  68.         this.memberCache.set(Object.values(userParams).join('-'), response);
  69.         return response;
  70.       })
  71.     );
  72.   }
  73.  
  74.   getMember(username: string) {
  75.     const member = [...this.memberCache.values()]
  76.       .reduce((arr, elem) => arr.concat(elem.result), [])
  77.       .find((member: Member) => member.username == username);
  78.  
  79.     if (member) {
  80.       return of(member);
  81.     }
  82.  
  83.     return this.http.get<Member>(this.baseUrl + 'users/' + username);
  84.   }
  85.  
  86.   updateMember(member: Member) {
  87.     return this.http.put(this.baseUrl + 'users', member);
  88.   }
  89.  
  90.   setMainPhoto(photoId: number) {
  91.     return this.http.put(this.baseUrl + 'users/set-main-photo/' + photoId, {})
  92.   }
  93.  
  94.   deletePhoto(photoId: number) {
  95.     return this.http.delete(this.baseUrl + 'users/delete-photo/' + photoId);
  96.   }
  97.  
  98.   addLike(username: string) {
  99.     return this.http.post(this.baseUrl + 'likes/' + username, {});
  100.   }
  101.  
  102.   getLikes(predicate: string, pageNumber: number, pageSize: number) {
  103.     let params = this.getPaginationHeaders(pageNumber, pageSize);
  104.  
  105.     params = params.append('predicate', predicate);
  106.  
  107.     return this.getPaginatedResult<Member[]>(this.baseUrl + 'likes', params);
  108.   }
  109.  
  110.   private getPaginatedResult<T>(url: string, params: HttpParams) {
  111.     const paginatedResult: PaginatedResult<T> = new PaginatedResult<T>;
  112.  
  113.     return this.http.get<T>(url, { observe: 'response', params }).pipe(
  114.       map(response => {
  115.         if (response.body) {
  116.           paginatedResult.result = response.body;
  117.         }
  118.         const pagination = response.headers.get('Pagination');
  119.         if (pagination) {
  120.           paginatedResult.pagination = JSON.parse(pagination);
  121.         }
  122.         return paginatedResult;
  123.       })
  124.     );
  125.   }
  126.  
  127.   private getPaginationHeaders(pageNumber: number, pageSize: number) {
  128.     let params = new HttpParams();
  129.  
  130.     params = params.append('pageNumber', pageNumber);
  131.     params = params.append('pageSize', pageSize);
  132.  
  133.     return params;
  134.   }
  135. }
  136. //listComponent.html
  137. <div class="text-center mt-3">
  138.     <h2>{{predicate==='liked'?'Members I like':'Members who like me'}}</h2>
  139. </div>
  140.  
  141. <div class="container mt-3">
  142.     <div class="d-flex">
  143.         <div class="btn-group" name="predicate">
  144.             <button class="btn btn-primary" btnRadio="liked" [(ngModel)]="predicate" (click)="loadLikes()">Members I
  145.                 like</button>
  146.             <button class="btn btn-primary" btnRadio="likedBy" [(ngModel)]="predicate" (click)="loadLikes()">Members who
  147.                 like me</button>
  148.         </div>
  149.     </div>
  150.  
  151.     <div class="row mt-3">
  152.         <div class="col-2" *ngFor="let member of members">
  153.             <app-member-card [member]="member"></app-member-card>
  154.         </div>
  155.     </div>
  156. </div>
  157.  
  158. <div class="d-flex justify-content-center" *ngIf="pagination && pagination.totalItems>0;else no_result_message">
  159.     <pagination [boundaryLinks]="true" [totalItems]="pagination.totalItems" [itemsPerPage]="pagination.itemsPerPage"
  160.         [maxSize]="10" [(ngModel)]="pagination.currentPage" (pageChanged)="pageChanged($event)" previousText="&lsaquo;"
  161.         nextText="&rsaquo;" firstText="&laquo;" lastText="&raquo;">
  162.     </pagination>
  163. </div>
  164.  
  165. <ng-template #no_result_message>
  166.     <div class="container">
  167.         <p>Opps... There is nothing here</p>
  168.     </div>
  169. </ng-template>
  170.  
  171. //listcomponent.ts
  172. import { Component, OnInit } from '@angular/core';
  173. import { Member } from '../_models/member.model';
  174. import { MembersService } from '../_services/members.service';
  175. import { Pagination } from '../_models/pagination';
  176.  
  177. @Component({
  178.   selector: 'app-lists',
  179.   templateUrl: './lists.component.html',
  180.   styleUrls: ['./lists.component.css']
  181. })
  182. export class ListsComponent implements OnInit {
  183.   members: Member[] | undefined;
  184.   predicate = 'liked';
  185.   pageNumber = 1;
  186.   pageSize = 5;
  187.   pagination: Pagination | undefined;
  188.  
  189.   constructor(private memberService: MembersService) { }
  190.  
  191.   ngOnInit(): void {
  192.     //this.loadLikes();
  193.   }
  194.  
  195.   loadLikes() {
  196.     this.memberService.getLikes(this.predicate, this.pageNumber, this.pageSize).subscribe({
  197.       next: response => {
  198.         this.members = response.result;
  199.         this.pagination = response.pagination;
  200.       }
  201.     })
  202.   }
  203.  
  204.   pageChanged(event: any) {
  205.     if (this.pageNumber !== event.page) {
  206.       this.pageNumber = event.page;
  207.       this.loadLikes();
  208.     }
  209.   }
  210. }
  211.  
  212. //membercard.html
  213. <div class="card mb-4" *ngIf="member">
  214.     <div class="card-img-wrapper">
  215.         <img src="{{member.photoUrl || './assets/user.png'}}" alt="{{member.knownAs}}" class="card-img-top">
  216.         <ul class="list-inline member-icons animate text-center">
  217.             <li class="list-inline-item">
  218.                 <button routerLink="/members/{{member.username}}" class="btn btn-primary"><i
  219.                         class="fa fa-user"></i></button>
  220.             </li>
  221.             <li class="list-inline-item">
  222.                 <button class="btn btn-primary"><i class="fa fa-heart"></i></button>
  223.             </li>
  224.             <li class="list-inline-item">
  225.                 <button class="btn btn-primary"><i class="fa fa-envelope"></i></button>
  226.             </li>
  227.         </ul>
  228.     </div>
  229.     <div class="card-body p-1">
  230.         <h6 class="card-title text-center mb-1">
  231.             <i class="fa fa-user me-2"></i>
  232.             {{member.knownAs}}, {{member.age}}
  233.         </h6>
  234.         <p class="card-text text-muted text-center">{{member.city}}</p>
  235.     </div>
  236. </div>
  237.  
  238. //member card .ts
  239. import { Component, Input } from '@angular/core';
  240. import { ToastrService } from 'ngx-toastr';
  241. import { Member } from 'src/app/_models/member.model';
  242. import { MembersService } from 'src/app/_services/members.service';
  243.  
  244. @Component({
  245.   selector: 'app-member-card',
  246.   templateUrl: './member-card.component.html',
  247.   styleUrls: ['./member-card.component.css']
  248. })
  249. export class MemberCardComponent {
  250.   @Input() member: Member | undefined;
  251.  
  252.   constructor(private memberService: MembersService, private toastr: ToastrService) { }
  253.  
  254.   addLike(member: Member) {
  255.     this.memberService.addLike(member.username).subscribe({
  256.       next: () => this.toastr.success('You have liked ' + member.knownAs)
  257.     })
  258.   }
  259. }
  260.  
  261. //nav.component.ts
  262. //import { Component, OnInit } from '@angular/core';
  263. import { AccountService } from '../_services/account.service';
  264. import { Router } from '@angular/router';
  265. import { ToastrService } from 'ngx-toastr';
  266. import { take } from 'rxjs';
  267. import { MembersService } from '../_services/members.service';
  268.  
  269. @Component({
  270.   selector: 'app-nav',
  271.   templateUrl: './nav.component.html',
  272.   styleUrls: ['./nav.component.css']
  273. })
  274. export class NavComponent implements OnInit {
  275.   model: any = {}
  276.  
  277.   constructor(public accountService: AccountService, private router: Router, private toastr: ToastrService,
  278.     private memberService: MembersService) { }
  279.  
  280.   ngOnInit(): void {
  281.     this.accountService.currentUser$.pipe(take(1)).subscribe({
  282.       //next: user => console.log(user)
  283.     })
  284.   }
  285.  
  286.   login() {
  287.     this.accountService.login(this.model).subscribe({
  288.       next: () => {
  289.         this.router.navigateByUrl('/members');
  290.       }
  291.     })
  292.   }
  293.  
  294.   logout() {
  295.     this.accountService.logout();
  296.     this.router.navigateByUrl('/');
  297.   }
  298. }
  299.  
  300.  
Advertisement
Add Comment
Please, Sign In to add comment