Files
adastra_app/src/app/components/herowars-guildwar/herowars-guildwar.component.ts
T
julien fa00719a3e feat(herowars): migrate JSON static imports to HttpClient assets
Replace all TypeScript JSON imports with an HWDataService that loads
6 data files from /assets/files-data/ via HttpClient with shareReplay(1).
Update all 9 consumer components to subscribe asynchronously. Remove
unused qcm-bpa.json import and dead methods from QcmComponent.
Add ADR 0013 documenting the decision.
2026-04-26 23:46:35 +02:00

136 lines
5.0 KiB
TypeScript

import { DatePipe, DecimalPipe } from '@angular/common';
import { Title } from '@angular/platform-browser';
import { trigger, state, style, animate, transition } from '@angular/animations';
import { Component, DestroyRef, inject, OnInit } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MatCardModule } from '@angular/material/card';
import { MatButtonModule } from '@angular/material/button';
import { MatDividerModule } from '@angular/material/divider';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatTabsModule } from '@angular/material/tabs';
import { CardContainerComponent, ListErrorsComponent } from '@components/shared';
import { CardColors, Errors, HWActivityStat, HWGuildClan, HWMember } from '@models';
import { ClanViewModel, MembersViewModel } from '@viewmodels/herowars';
import { HWClanService, HWMemberService, UtilitiesService } from '@services';
import { MAX_CLAN_MEMBERS } from '@constants';
@Component({
selector: 'app-herowars-guildwar',
imports: [
DatePipe,
DecimalPipe,
FormsModule,
CardContainerComponent,
ListErrorsComponent,
MatButtonModule,
MatCardModule,
MatDividerModule,
MatFormFieldModule,
MatIconModule,
MatInputModule,
MatTabsModule,
],
templateUrl: './herowars-guildwar.component.html',
styleUrl: './herowars-guildwar.component.scss',
animations: [
trigger('flyInOut', [
state('in', style({ transform: 'translateY(0)' })),
transition('void => *', [style({ transform: 'translateY(-100%)' }), animate(200)]),
transition('* => void', [style({ transform: 'translateY(100%)' }), animate(200)]),
]),
],
})
export class HerowarsGuildwarComponent implements OnInit {
private _titleService = inject(Title);
private _utilitiesService = inject(UtilitiesService);
private _clanService = inject(HWClanService);
private _memberService = inject(HWMemberService);
public destroyRef = inject(DestroyRef);
public title = 'Guild War';
public subtitle = 'Log';
public description = 'Tools in working progress.';
public colors: CardColors = { background: 'bg-raspberry', text: 'text-bg-primary' };
public errors: Errors = { errors: {} };
public now = new Date();
public daysToWarn = 1;
public maxClanMembers = MAX_CLAN_MEMBERS;
public clanLoaded = false;
public membersLoaded = false;
public clanViewModel: ClanViewModel = {} as ClanViewModel;
public membersViewModel: MembersViewModel = {} as MembersViewModel;
private _guildClan: HWGuildClan = {} as HWGuildClan;
private _guildMembers: HWMember[] = [];
private _guildInfo: HWActivityStat = {} as HWActivityStat;
ngOnInit() {
this._titleService.setTitle(this.title);
}
getClanViewModel(): ClanViewModel {
return this.clanViewModel;
}
getMembersViewModel(): MembersViewModel {
return this.membersViewModel;
}
getColors(color = 'megna'): CardColors {
if (color === 'accent') {
this.colors = { background: 'bg-accent', text: 'text-navy' };
} else if (color === 'raspberry') {
this.colors = { background: 'bg-raspberry', text: 'text-bg-primary' };
} else {
this.colors = { background: 'bg-megna', text: 'text-bg-primary' };
}
return this.colors;
}
loadClan(): void {
this._clanService.loadClan().subscribe((clan) => {
this._guildClan = clan;
this.clanViewModel = new ClanViewModel(this._guildClan);
this.clanLoaded = true;
});
}
loadData(): void {
this._clanService.loadClan().subscribe((clan) => {
this._guildClan = clan;
this._memberService.loadMembers(this._guildClan).subscribe((members) => {
this._guildMembers = members;
this._guildClan = this._clanService.loadClanStats(this._guildClan, this._guildMembers);
this.daysToWarn = parseInt(this._guildClan.daysToKick) / 2;
this.clanViewModel = new ClanViewModel(this._guildClan);
this.clanLoaded = true;
this.membersViewModel = new MembersViewModel(this._guildMembers);
this.membersLoaded = true;
});
});
}
loadMembers(): void {
this._memberService.loadMembers(this._guildClan).subscribe((members) => {
this._guildMembers = members;
this.membersViewModel = new MembersViewModel(this._guildMembers);
this._guildClan = this._clanService.loadClanStats(this._guildClan, this._guildMembers);
this.membersLoaded = true;
});
}
getMembers(): HWMember[] {
return this._guildMembers;
}
syncClan(): void {
console.log(this._guildClan);
}
syncMembers(): void {
console.log(this._guildMembers);
}
}