NumbersComponent did not update on Push + subscription cleanup + code clean

This commit is contained in:
Patrick Haßel 2024-11-06 15:21:24 +01:00
parent 6eb7165bf1
commit 5987330089
5 changed files with 48 additions and 21 deletions

View File

@ -17,7 +17,7 @@ export class Group extends GroupUuid {
super(uuid); super(uuid);
} }
isOwner(user: UserPublic) { isOwner(user: UserPublic): boolean {
return this.owner.publicUuid === user.publicUuid; return this.owner.publicUuid === user.publicUuid;
} }
@ -33,7 +33,7 @@ export class Group extends GroupUuid {
); );
} }
usersByNameOwnerFirst() { usersByNameOwnerFirst(): UserPublic[] {
return this.users.sort((a, b) => this.compareOwnerFirstThenName(a, b)); return this.users.sort((a, b) => this.compareOwnerFirstThenName(a, b));
} }
@ -50,17 +50,21 @@ export class Group extends GroupUuid {
return a.created.getTime() - b.created.getTime(); return a.created.getTime() - b.created.getTime();
} }
isOwnedBy(user: UserPublic | UserPrivate | null) { isOwnedBy(user: UserPublic | UserPrivate | null): boolean {
return user !== null && user.is(this.owner); return user !== null && user.is(this.owner);
} }
bannedByName() { bannedByName(): UserPublic[] {
return this.banned.sort(UserPublic.compareName); return this.banned.sort(UserPublic.compareName);
} }
hasUser(user: UserPublic) { hasUser(user: UserPublic): boolean {
return this.users.some(u => u.is(user)); return this.users.some(u => u.is(user));
} }
equals(group: Group | null): boolean {
return this.uuid === group?.uuid;
}
} }

View File

@ -27,4 +27,8 @@ export class Numbers {
return this.lots.filter(u => u.user.is(user))[0]; return this.lots.filter(u => u.user.is(user))[0];
} }
sameGroup(numbers: Numbers): boolean {
return this.group.equals(numbers.group);
}
} }

View File

@ -24,12 +24,12 @@ import {Subscription, timer} from "rxjs";
}) })
export class NumbersComponent implements OnInit, OnDestroy { export class NumbersComponent implements OnInit, OnDestroy {
private readonly subs: Subscription[] = [];
protected numbers: Numbers | null = null; protected numbers: Numbers | null = null;
protected now: Date = new Date(); protected now: Date = new Date();
private timer?: Subscription;
constructor( constructor(
protected readonly activatedRoute: ActivatedRoute, protected readonly activatedRoute: ActivatedRoute,
protected readonly numbersService: NumbersService, protected readonly numbersService: NumbersService,
@ -40,8 +40,8 @@ export class NumbersComponent implements OnInit, OnDestroy {
} }
ngOnInit(): void { ngOnInit(): void {
this.timer = timer(1000, 1000).subscribe(() => this.now = new Date()); this.subs.push(timer(1000, 1000).subscribe(() => this.now = new Date()));
this.activatedRoute.params.subscribe(params => { this.subs.push(this.activatedRoute.params.subscribe(params => {
const uuid = params['uuid']; const uuid = params['uuid'];
if (uuid) { if (uuid) {
this.numbersService.canAccess(uuid, granted => { this.numbersService.canAccess(uuid, granted => {
@ -54,14 +54,17 @@ export class NumbersComponent implements OnInit, OnDestroy {
} else { } else {
this.numbers = null; this.numbers = null;
} }
}));
this.userService.subscribePush(Numbers, numbers => {
if (this.numbers?.sameGroup(numbers)) {
this.numbers = numbers;
}
}); });
} }
ngOnDestroy(): void { ngOnDestroy(): void {
if (this.timer) { this.subs.forEach(sub => sub.unsubscribe());
this.timer.unsubscribe(); this.subs.length = 0;
this.timer = undefined;
}
} }
@HostListener('window:keydown.escape') @HostListener('window:keydown.escape')

View File

@ -1,9 +1,10 @@
import {Component, Inject, LOCALE_ID, OnInit} from '@angular/core'; import {Component, Inject, LOCALE_ID, OnDestroy, OnInit} from '@angular/core';
import {BODIES, BODIES_PRINT, EARTH, EARTH_MOON, JUPITER, JUPITER_SCALED_DIAMETER, SUN} from "../SOLAR_SYSTEM"; import {BODIES, BODIES_PRINT, EARTH, EARTH_MOON, JUPITER, JUPITER_SCALED_DIAMETER, SUN} from "../SOLAR_SYSTEM";
import {ActivatedRoute, Params} from "@angular/router"; import {ActivatedRoute, Params} from "@angular/router";
import {DecimalPipe, NgForOf, NgIf} from "@angular/common"; import {DecimalPipe, NgForOf, NgIf} from "@angular/common";
import {MIO_KILO, SolarSystemBody} from "../SolarSystemBody"; import {MIO_KILO, SolarSystemBody} from "../SolarSystemBody";
import {Unit} from "../../../../Unit"; import {Unit} from "../../../../Unit";
import {Subscription} from "rxjs";
function getScale(params: Params) { function getScale(params: Params) {
if ('scale' in params) { if ('scale' in params) {
@ -37,10 +38,12 @@ export function makePaler(hexColor: string, factor: number): string {
templateUrl: './solar-system-printout.component.html', templateUrl: './solar-system-printout.component.html',
styleUrl: './solar-system-printout.component.less' styleUrl: './solar-system-printout.component.less'
}) })
export class SolarSystemPrintoutComponent implements OnInit { export class SolarSystemPrintoutComponent implements OnInit, OnDestroy {
public readonly PRINTABLE_ONLY: boolean = true; public readonly PRINTABLE_ONLY: boolean = true;
private readonly subs: Subscription[] = [];
protected readonly makePaler = makePaler; protected readonly makePaler = makePaler;
protected readonly BODIES_PRINT = BODIES_PRINT; protected readonly BODIES_PRINT = BODIES_PRINT;
@ -64,10 +67,15 @@ export class SolarSystemPrintoutComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
JUPITER.scaledDiameter = JUPITER_SCALED_DIAMETER; JUPITER.scaledDiameter = JUPITER_SCALED_DIAMETER;
this.activatedRoute.params.subscribe(params => { this.subs.push(this.activatedRoute.params.subscribe(params => {
const scale = getScale(params); const scale = getScale(params);
BODIES.forEach(b => b.scale(scale)); BODIES.forEach(b => b.scale(scale));
}); }));
}
ngOnDestroy(): void {
this.subs.forEach(sub => sub.unsubscribe());
this.subs.length = 0;
} }
fontSize(body: SolarSystemBody): string { fontSize(body: SolarSystemBody): string {

View File

@ -1,4 +1,4 @@
import {Component, OnInit} from '@angular/core'; import {Component, OnDestroy, OnInit} from '@angular/core';
import {NgForOf, NgIf} from "@angular/common"; import {NgForOf, NgIf} from "@angular/common";
import {ActivatedRoute} from "@angular/router"; import {ActivatedRoute} from "@angular/router";
import {GroupListComponent} from "../group/shared/group-list/group-list.component"; import {GroupListComponent} from "../group/shared/group-list/group-list.component";
@ -8,6 +8,7 @@ import {Group} from "../../api/group/Group";
import {UserPublic} from "../../api/User/UserPublic"; import {UserPublic} from "../../api/User/UserPublic";
import {ReactiveFormsModule} from "@angular/forms"; import {ReactiveFormsModule} from "@angular/forms";
import {TextComponent} from "../../shared/text/text.component"; import {TextComponent} from "../../shared/text/text.component";
import {Subscription} from "rxjs";
@Component({ @Component({
selector: 'app-user', selector: 'app-user',
@ -22,7 +23,9 @@ import {TextComponent} from "../../shared/text/text.component";
templateUrl: './user.component.html', templateUrl: './user.component.html',
styleUrl: './user.component.less' styleUrl: './user.component.less'
}) })
export class UserComponent implements OnInit { export class UserComponent implements OnInit, OnDestroy {
private readonly subs: Subscription[] = [];
protected user: UserPublic | null = null; protected user: UserPublic | null = null;
@ -37,13 +40,18 @@ export class UserComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.activatedRoute.params.subscribe(params => { this.subs.push(this.activatedRoute.params.subscribe(params => {
const publicUuid = params['publicUuid']; const publicUuid = params['publicUuid'];
if (publicUuid) { if (publicUuid) {
this.userService.getByPublicUuid(publicUuid, user => this.user = user); this.userService.getByPublicUuid(publicUuid, user => this.user = user);
this.groupService.findAllCommon(publicUuid, commonGroups => this.commonGroups = commonGroups); this.groupService.findAllCommon(publicUuid, commonGroups => this.commonGroups = commonGroups);
} }
}); }));
}
ngOnDestroy(): void {
this.subs.forEach(sub => sub.unsubscribe());
this.subs.length = 0;
} }
} }