import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { AdminData, User } from '@ghostfolio/common/interfaces'; import { differenceInSeconds, formatDistanceToNowStrict, parseISO } from 'date-fns'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ selector: 'gf-admin-users', styleUrls: ['./admin-users.scss'], templateUrl: './admin-users.html' }) export class AdminUsersComponent implements OnDestroy, OnInit { public user: User; public users: AdminData['users']; private unsubscribeSubject = new Subject(); public constructor( private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, private userService: UserService ) { this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { if (state?.user) { this.user = state.user; } }); } public ngOnInit() { this.fetchAdminData(); } public formatDistanceToNow(aDateString: string) { if (aDateString) { const distanceString = formatDistanceToNowStrict(parseISO(aDateString), { addSuffix: true }); return Math.abs(differenceInSeconds(parseISO(aDateString), new Date())) < 60 ? 'just now' : distanceString; } return ''; } public onDeleteUser(aId: string) { const confirmation = confirm( $localize`Do you really want to delete this user?` ); if (confirmation) { this.dataService .deleteUser(aId) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe({ next: () => { this.fetchAdminData(); } }); } } public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); } private fetchAdminData() { this.dataService .fetchAdminData() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ users }) => { this.users = users; this.changeDetectorRef.markForCheck(); }); } }