attribute-field.component.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { Component, Input } from '@angular/core';
  2. import { Attribute } from 'src/interfaces/attribute';
  3. import { DataService } from 'src/services/data/data.service';
  4. import { DetailsService } from 'src/services/details/details.service';
  5. import { Observable } from 'rxjs';
  6. import { AttributeDetailsComponent } from './attribute-details/attribute-details.component';
  7. import { TranslateService } from '@ngx-translate/core';
  8. @Component({
  9. selector: 'attribute-field',
  10. templateUrl: './attribute-field.component.html',
  11. styleUrls: ['./attribute-field.component.scss'],
  12. })
  13. export class AttributeFieldComponent {
  14. @Input() attributeName: string = '';
  15. public attribute: Attribute = { name: '', value: 0, proficiency: false };
  16. public attributeModifier: string = '0';
  17. public saveModifier: string = '0';
  18. public proficiencyBonus: number = 0;
  19. public resistances: string[][] = [];
  20. public constructor(
  21. public dataAccessor: DataService,
  22. public detailsAccessor: DetailsService,
  23. public translate: TranslateService,
  24. ) {}
  25. ngOnInit(): void {
  26. this.initAttributeSubscription();
  27. }
  28. private initAttributeSubscription(): void {
  29. const observable: Observable<Attribute> = eval(
  30. `this.dataAccessor.${this.attributeName}$`,
  31. );
  32. observable.subscribe((newValue: Attribute) => {
  33. this.attribute = newValue;
  34. this.attributeModifier = this.calculateModifier();
  35. });
  36. }
  37. public updateValue(): void {
  38. this.dataAccessor.updateAttribute({
  39. name: this.attribute.name,
  40. value: this.attribute.value,
  41. proficiency: this.attribute.proficiency,
  42. });
  43. this.dataAccessor.resistances = this.resistances;
  44. }
  45. public calculateModifier(): string {
  46. const mod: number = Math.floor((this.attribute.value - 10) / 2);
  47. if (mod > 0) {
  48. return '+' + mod;
  49. } else {
  50. return mod.toString();
  51. }
  52. }
  53. public openDetails(): void {
  54. this.detailsAccessor.openPanel(AttributeDetailsComponent, {
  55. attribute: this.attribute,
  56. modifier: this.attributeModifier,
  57. });
  58. const resultSubscription = this.detailsAccessor.result$.subscribe(
  59. (result) => {
  60. if (result.state === 'update') {
  61. this.resistances = result.data.resistances;
  62. this.updateValue();
  63. }
  64. resultSubscription.unsubscribe();
  65. },
  66. );
  67. }
  68. }