Browse Source

fix(client): prevent race condition in nested subscription

pull/7309/head
KenTandrian 2 days ago
parent
commit
af58a26c7c
  1. 42
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  2. 7
      apps/client/src/app/pages/portfolio/activities/interfaces/interfaces.ts

42
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -32,11 +32,14 @@ import { MatTableDataSource } from '@angular/material/table';
import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { ActivatedRoute, Router, RouterModule } from '@angular/router';
import { format, parseISO } from 'date-fns'; import { format, parseISO } from 'date-fns';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
import { of } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { GfCreateOrUpdateActivityDialogComponent } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component'; import { GfCreateOrUpdateActivityDialogComponent } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component';
import { CreateOrUpdateActivityDialogParams } from './create-or-update-activity-dialog/interfaces/interfaces'; import { CreateOrUpdateActivityDialogParams } from './create-or-update-activity-dialog/interfaces/interfaces';
import { GfImportActivitiesDialogComponent } from './import-activities-dialog/import-activities-dialog.component'; import { GfImportActivitiesDialogComponent } from './import-activities-dialog/import-activities-dialog.component';
import { ImportActivitiesDialogParams } from './import-activities-dialog/interfaces/interfaces'; import { ImportActivitiesDialogParams } from './import-activities-dialog/interfaces/interfaces';
import { ActivitiesPageParams } from './interfaces/interfaces';
@Component({ @Component({
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -71,34 +74,33 @@ export class GfActivitiesPageComponent implements OnInit {
private readonly deviceDetectorService = inject(DeviceDetectorService); private readonly deviceDetectorService = inject(DeviceDetectorService);
private readonly dialog = inject(MatDialog); private readonly dialog = inject(MatDialog);
private readonly icsService = inject(IcsService); private readonly icsService = inject(IcsService);
private readonly impersonationStorageService = inject(ImpersonationStorageService); private readonly impersonationStorageService = inject(
ImpersonationStorageService
);
private readonly route = inject(ActivatedRoute); private readonly route = inject(ActivatedRoute);
private readonly router = inject(Router); private readonly router = inject(Router);
private readonly userService = inject(UserService); private readonly userService = inject(UserService);
public constructor() { public constructor() {
this.route.queryParams this.route.queryParams
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(
.subscribe((params) => { takeUntilDestroyed(this.destroyRef),
if (params['createDialog']) { switchMap((params: ActivitiesPageParams) => {
if (params['activityId']) { if (params.activityId && (params.createDialog || params.editDialog)) {
this.dataService return this.dataService
.fetchActivity(params['activityId']) .fetchActivity(params.activityId)
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(map((activity) => ({ activity, params })));
.subscribe((activity) => {
this.openCreateActivityDialog(activity);
});
} else {
this.openCreateActivityDialog();
} }
} else if (params['editDialog']) {
if (params['activityId']) { return of({ activity: undefined, params });
this.dataService })
.fetchActivity(params['activityId']) )
.pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ activity, params }) => {
.subscribe((activity) => { if (params.createDialog) {
this.openCreateActivityDialog(activity);
} else if (params.editDialog) {
if (activity) {
this.openUpdateActivityDialog(activity); this.openUpdateActivityDialog(activity);
});
} else { } else {
this.router.navigate(['.'], { relativeTo: this.route }); this.router.navigate(['.'], { relativeTo: this.route });
} }

7
apps/client/src/app/pages/portfolio/activities/interfaces/interfaces.ts

@ -0,0 +1,7 @@
import { Params } from '@angular/router';
export interface ActivitiesPageParams extends Params {
activityId?: string;
createDialog?: string;
editDialog?: string;
}
Loading…
Cancel
Save