cic-staff-client/src/app/pages/accounts/account-details/account-details.component.ts

260 lines
8.9 KiB
TypeScript
Raw Normal View History

2021-05-10 18:15:25 +02:00
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
OnInit,
ViewChild,
} from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';
import {
BlockSyncService,
LocationService,
LoggingService,
TokenService,
TransactionService,
UserService,
} from '@app/_services';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { first } from 'rxjs/operators';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { copyToClipboard, CustomErrorStateMatcher, exportCsv } from '@app/_helpers';
import { MatSnackBar } from '@angular/material/snack-bar';
import { add0x, strip0x } from '@src/assets/js/ethtx/dist/hex';
import { environment } from '@src/environments/environment';
import { AccountDetails, AreaName, AreaType, Category, Transaction } from '@app/_models';
2020-11-25 08:57:17 +01:00
@Component({
selector: 'app-account-details',
templateUrl: './account-details.component.html',
styleUrls: ['./account-details.component.scss'],
2021-05-10 18:15:25 +02:00
changeDetection: ChangeDetectionStrategy.OnPush,
2020-11-25 08:57:17 +01:00
})
export class AccountDetailsComponent implements OnInit {
transactionsDataSource: MatTableDataSource<any>;
2021-04-30 14:50:16 +02:00
transactionsDisplayedColumns: Array<string> = ['sender', 'recipient', 'value', 'created', 'type'];
transactionsDefaultPageSize: number = 10;
transactionsPageSizeOptions: Array<number> = [10, 20, 50, 100];
2021-05-10 18:15:25 +02:00
@ViewChild('TransactionTablePaginator', { static: true }) transactionTablePaginator: MatPaginator;
@ViewChild('TransactionTableSort', { static: true }) transactionTableSort: MatSort;
userDataSource: MatTableDataSource<any>;
2021-04-30 14:50:16 +02:00
userDisplayedColumns: Array<string> = ['name', 'phone', 'created', 'balance', 'location'];
usersDefaultPageSize: number = 10;
usersPageSizeOptions: Array<number> = [10, 20, 50, 100];
2021-05-10 18:15:25 +02:00
@ViewChild('UserTablePaginator', { static: true }) userTablePaginator: MatPaginator;
@ViewChild('UserTableSort', { static: true }) userTableSort: MatSort;
2021-02-08 12:47:07 +01:00
accountInfoForm: FormGroup;
2021-04-30 14:50:16 +02:00
account: AccountDetails;
2021-03-15 12:58:18 +01:00
accountAddress: string;
accountStatus: any;
2021-04-30 14:50:16 +02:00
accounts: Array<AccountDetails> = [];
accountsType: string = 'all';
categories: Array<Category>;
areaNames: Array<AreaName>;
areaTypes: Array<AreaType>;
transaction: any;
2021-04-30 14:50:16 +02:00
transactions: Array<Transaction>;
transactionsType: string = 'all';
accountTypes: Array<string>;
transactionsTypes: Array<string>;
genders: Array<string>;
matcher: CustomErrorStateMatcher = new CustomErrorStateMatcher();
2021-02-08 12:47:07 +01:00
submitted: boolean = false;
bloxbergLink: string;
2020-11-25 08:57:17 +01:00
constructor(
2021-02-08 12:47:07 +01:00
private formBuilder: FormBuilder,
private locationService: LocationService,
2020-11-25 08:57:17 +01:00
private transactionService: TransactionService,
private userService: UserService,
private route: ActivatedRoute,
private router: Router,
private tokenService: TokenService,
2021-03-15 12:58:18 +01:00
private loggingService: LoggingService,
private blockSyncService: BlockSyncService,
private cdr: ChangeDetectorRef,
2021-05-10 18:15:25 +02:00
private snackBar: MatSnackBar
2020-11-25 08:57:17 +01:00
) {
2021-02-08 12:47:07 +01:00
this.accountInfoForm = this.formBuilder.group({
name: ['', Validators.required],
phoneNumber: ['', Validators.required],
age: ['', Validators.required],
2021-02-08 12:47:07 +01:00
type: ['', Validators.required],
bio: ['', Validators.required],
gender: ['', Validators.required],
businessCategory: ['', Validators.required],
userLocation: ['', Validators.required],
location: ['', Validators.required],
locationType: ['', Validators.required],
2021-02-08 12:47:07 +01:00
});
2021-05-19 09:56:39 +02:00
this.route.paramMap.subscribe((params: Params) => {
this.accountAddress = add0x(params.get('id'));
2021-05-10 18:15:25 +02:00
this.bloxbergLink =
'https://blockexplorer.bloxberg.org/address/' + this.accountAddress + '/transactions';
2021-03-15 12:58:18 +01:00
this.blockSyncService.blockSync(this.accountAddress);
});
2021-05-19 09:56:39 +02:00
}
async ngOnInit(): Promise<void> {
(await this.userService.getAccountByAddress(this.accountAddress, 100)).subscribe(
async (res) => {
if (res !== undefined) {
this.account = res;
this.cdr.detectChanges();
this.loggingService.sendInfoLevelMessage(this.account);
// this.userService.getAccountStatus(this.account.vcard?.tel[0].value).pipe(first())
// .subscribe(response => this.accountStatus = response);
this.accountInfoForm.patchValue({
name: this.account.vcard?.fn[0].value,
phoneNumber: this.account.vcard?.tel[0].value,
age: this.account.age,
type: this.account.type,
bio: this.account.products,
gender: this.account.gender,
businessCategory: this.account.category,
userLocation: this.account.location.area_name,
location: this.account.location.area,
locationType: this.account.location.area_type,
});
} else {
alert('Account not found!');
}
}
);
this.userService.accountsSubject.subscribe((accounts) => {
this.userDataSource = new MatTableDataSource<any>(accounts);
this.userDataSource.paginator = this.userTablePaginator;
this.userDataSource.sort = this.userTableSort;
this.accounts = accounts;
});
this.transactionService.transactionsSubject.subscribe((transactions) => {
this.transactionsDataSource = new MatTableDataSource<any>(transactions);
this.transactionsDataSource.paginator = this.transactionTablePaginator;
this.transactionsDataSource.sort = this.transactionTableSort;
this.transactions = transactions;
this.cdr.detectChanges();
});
2021-05-10 18:15:25 +02:00
this.userService
.getCategories()
.pipe(first())
.subscribe((res) => (this.categories = res));
this.locationService
.getAreaNames()
.pipe(first())
.subscribe((res) => (this.areaNames = res));
this.locationService
.getAreaTypes()
.pipe(first())
.subscribe((res) => (this.areaTypes = res));
this.userService
.getAccountTypes()
.pipe(first())
.subscribe((res) => (this.accountTypes = res));
this.userService
.getTransactionTypes()
.pipe(first())
.subscribe((res) => (this.transactionsTypes = res));
this.userService
.getGenders()
.pipe(first())
.subscribe((res) => (this.genders = res));
2020-11-25 08:57:17 +01:00
}
doTransactionFilter(value: string): void {
this.transactionsDataSource.filter = value.trim().toLocaleLowerCase();
2020-11-25 08:57:17 +01:00
}
doUserFilter(value: string): void {
this.userDataSource.filter = value.trim().toLocaleLowerCase();
2020-11-25 08:57:17 +01:00
}
viewTransaction(transaction): void {
this.transaction = transaction;
}
viewAccount(account): void {
2021-05-10 18:15:25 +02:00
this.router.navigateByUrl(
`/accounts/${strip0x(account.identities.evm[`bloxberg:${environment.bloxbergChainId}`][0])}`
);
}
2021-05-10 18:15:25 +02:00
get accountInfoFormStub(): any {
return this.accountInfoForm.controls;
}
2021-02-08 12:47:07 +01:00
async saveInfo(): Promise<void> {
2021-02-08 12:47:07 +01:00
this.submitted = true;
2021-05-10 18:15:25 +02:00
if (this.accountInfoForm.invalid || !confirm(`Change user's profile information?`)) {
return;
}
const accountKey = await this.userService.changeAccountInfo(
this.accountAddress,
2021-02-08 12:47:07 +01:00
this.accountInfoFormStub.name.value,
this.accountInfoFormStub.phoneNumber.value,
this.accountInfoFormStub.age.value,
2021-02-08 12:47:07 +01:00
this.accountInfoFormStub.type.value,
this.accountInfoFormStub.bio.value,
this.accountInfoFormStub.gender.value,
this.accountInfoFormStub.businessCategory.value,
this.accountInfoFormStub.userLocation.value,
this.accountInfoFormStub.location.value,
2021-04-27 19:22:42 +02:00
this.accountInfoFormStub.locationType.value
);
2021-02-08 12:47:07 +01:00
this.submitted = false;
}
filterAccounts(): void {
if (this.accountsType === 'all') {
2021-05-10 18:15:25 +02:00
this.userService.accountsSubject.subscribe((accounts) => {
this.userDataSource.data = accounts;
this.accounts = accounts;
});
} else {
2021-05-10 18:15:25 +02:00
this.userDataSource.data = this.accounts.filter(
(account) => account.type === this.accountsType
);
}
}
filterTransactions(): void {
if (this.transactionsType === 'all') {
2021-05-10 18:15:25 +02:00
this.transactionService.transactionsSubject.subscribe((transactions) => {
this.transactionsDataSource.data = transactions;
this.transactions = transactions;
});
} else {
2021-05-10 18:15:25 +02:00
this.transactionsDataSource.data = this.transactions.filter(
(transaction) => transaction.type === this.transactionsType
);
}
}
2021-02-08 12:47:07 +01:00
resetPin(): void {
2021-05-10 18:15:25 +02:00
if (!confirm(`Reset user's pin?`)) {
return;
}
this.userService
.resetPin(this.account.vcard.tel[0].value)
.pipe(first())
.subscribe((res) => {
this.loggingService.sendInfoLevelMessage(`Response: ${res}`);
});
2021-02-08 12:47:07 +01:00
}
2021-03-24 14:26:51 +01:00
downloadCsv(data: any, filename: string): void {
exportCsv(data, filename);
}
copyAddress(): void {
if (copyToClipboard(this.accountAddress)) {
2021-05-10 18:15:25 +02:00
this.snackBar.open(this.accountAddress + ' copied successfully!', 'Close', {
duration: 3000,
});
}
}
2020-11-25 08:57:17 +01:00
}