diff --git a/src/app/features/home/transaction/transaction-routing.module.ts b/src/app/features/home/activities/activities-routing.module.ts similarity index 59% rename from src/app/features/home/transaction/transaction-routing.module.ts rename to src/app/features/home/activities/activities-routing.module.ts index 6d56d80bc..b77463fd8 100644 --- a/src/app/features/home/transaction/transaction-routing.module.ts +++ b/src/app/features/home/activities/activities-routing.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { TransactionPage } from './transaction.page'; +import { TransactionPage } from './activities.page'; const routes: Routes = [ { @@ -8,11 +8,11 @@ const routes: Routes = [ component: TransactionPage, }, { - path: 'transaction-details', + path: 'capture-transaction-details', loadChildren: () => - import('./transaction-details/transaction-details.module').then( - m => m.TransactionDetailsPageModule - ), + import( + './capture-transaction-details/capture-transaction-details.module' + ).then(m => m.TransactionDetailsPageModule), }, ]; diff --git a/src/app/features/home/activities/activities.module.ts b/src/app/features/home/activities/activities.module.ts new file mode 100644 index 000000000..fd2127e22 --- /dev/null +++ b/src/app/features/home/activities/activities.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from '../../../shared/shared.module'; +import { TransactionPageRoutingModule } from './activities-routing.module'; +import { TransactionPage } from './activities.page'; +import { CaptureTransactionsComponent } from './capture-transactions/capture-transactions.component'; +import { NetworkActionOrdersComponent } from './network-action-orders/network-action-orders.component'; + +@NgModule({ + imports: [SharedModule, TransactionPageRoutingModule], + declarations: [ + TransactionPage, + CaptureTransactionsComponent, + NetworkActionOrdersComponent, + ], +}) +export class TransactionPageModule {} diff --git a/src/app/features/home/activities/activities.page.html b/src/app/features/home/activities/activities.page.html new file mode 100644 index 000000000..e8f8976da --- /dev/null +++ b/src/app/features/home/activities/activities.page.html @@ -0,0 +1,26 @@ + + + {{ t('activity') }} + + + + + + {{ t('captureTransactions') }} + + + {{ t('message.moreActions') }} + + + +
+
+ +
+
+ +
+
+
diff --git a/src/app/features/home/activities/activities.page.scss b/src/app/features/home/activities/activities.page.scss new file mode 100644 index 000000000..f9aa9a8dc --- /dev/null +++ b/src/app/features/home/activities/activities.page.scss @@ -0,0 +1,5 @@ +mat-toolbar { + span { + padding-right: 40px; + } +} diff --git a/src/app/features/home/transaction/transaction.page.spec.ts b/src/app/features/home/activities/activities.page.spec.ts similarity index 92% rename from src/app/features/home/transaction/transaction.page.spec.ts rename to src/app/features/home/activities/activities.page.spec.ts index 45b46d4a4..b6659ae67 100644 --- a/src/app/features/home/transaction/transaction.page.spec.ts +++ b/src/app/features/home/activities/activities.page.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { SharedTestingModule } from '../../../shared/shared-testing.module'; -import { TransactionPage } from './transaction.page'; +import { TransactionPage } from './activities.page'; describe('TransactionPage', () => { let component: TransactionPage; diff --git a/src/app/features/home/activities/activities.page.ts b/src/app/features/home/activities/activities.page.ts new file mode 100644 index 000000000..caaf4ed4f --- /dev/null +++ b/src/app/features/home/activities/activities.page.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; +import { UntilDestroy } from '@ngneat/until-destroy'; + +@UntilDestroy({ checkProperties: true }) +@Component({ + selector: 'app-activities', + templateUrl: './activities.page.html', + styleUrls: ['./activities.page.scss'], +}) +export class TransactionPage {} diff --git a/src/app/features/home/transaction/transaction-details/transaction-details-routing.module.ts b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details-routing.module.ts similarity index 80% rename from src/app/features/home/transaction/transaction-details/transaction-details-routing.module.ts rename to src/app/features/home/activities/capture-transaction-details/capture-transaction-details-routing.module.ts index b662d9605..2dd947340 100644 --- a/src/app/features/home/transaction/transaction-details/transaction-details-routing.module.ts +++ b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details-routing.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { TransactionDetailsPage } from './transaction-details.page'; +import { TransactionDetailsPage } from './capture-transaction-details.page'; const routes: Routes = [ { diff --git a/src/app/features/home/transaction/transaction-details/transaction-details.module.ts b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.module.ts similarity index 60% rename from src/app/features/home/transaction/transaction-details/transaction-details.module.ts rename to src/app/features/home/activities/capture-transaction-details/capture-transaction-details.module.ts index 4c6812e69..8e56c3e39 100644 --- a/src/app/features/home/transaction/transaction-details/transaction-details.module.ts +++ b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '../../../../shared/shared.module'; -import { TransactionDetailsPageRoutingModule } from './transaction-details-routing.module'; -import { TransactionDetailsPage } from './transaction-details.page'; +import { TransactionDetailsPageRoutingModule } from './capture-transaction-details-routing.module'; +import { TransactionDetailsPage } from './capture-transaction-details.page'; @NgModule({ imports: [SharedModule, TransactionDetailsPageRoutingModule], diff --git a/src/app/features/home/transaction/transaction-details/transaction-details.page.html b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.html similarity index 100% rename from src/app/features/home/transaction/transaction-details/transaction-details.page.html rename to src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.html diff --git a/src/app/features/home/transaction/transaction-details/transaction-details.page.scss b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.scss similarity index 100% rename from src/app/features/home/transaction/transaction-details/transaction-details.page.scss rename to src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.scss diff --git a/src/app/features/home/transaction/transaction-details/transaction-details.page.spec.ts b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.spec.ts similarity index 90% rename from src/app/features/home/transaction/transaction-details/transaction-details.page.spec.ts rename to src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.spec.ts index dc5d2df63..9468670ff 100644 --- a/src/app/features/home/transaction/transaction-details/transaction-details.page.spec.ts +++ b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { SharedTestingModule } from '../../../../shared/shared-testing.module'; -import { TransactionDetailsPage } from './transaction-details.page'; +import { TransactionDetailsPage } from './capture-transaction-details.page'; describe('TransactionDetailsPage', () => { let component: TransactionDetailsPage; diff --git a/src/app/features/home/transaction/transaction-details/transaction-details.page.ts b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.ts similarity index 93% rename from src/app/features/home/transaction/transaction-details/transaction-details.page.ts rename to src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.ts index a525da38c..6a225e44d 100644 --- a/src/app/features/home/transaction/transaction-details/transaction-details.page.ts +++ b/src/app/features/home/activities/capture-transaction-details/capture-transaction-details.page.ts @@ -11,9 +11,9 @@ import { ErrorService } from '../../../../shared/error/error.service'; import { isNonNullable } from '../../../../utils/rx-operators/rx-operators'; @UntilDestroy({ checkProperties: true }) @Component({ - selector: 'app-transaction-details', - templateUrl: './transaction-details.page.html', - styleUrls: ['./transaction-details.page.scss'], + selector: 'app-capture-transaction-details', + templateUrl: './capture-transaction-details.page.html', + styleUrls: ['./capture-transaction-details.page.scss'], }) export class TransactionDetailsPage { readonly transaction$ = this.route.paramMap.pipe( diff --git a/src/app/features/home/transaction/transaction.page.html b/src/app/features/home/activities/capture-transactions/capture-transactions.component.html similarity index 75% rename from src/app/features/home/transaction/transaction.page.html rename to src/app/features/home/activities/capture-transactions/capture-transactions.component.html index 091166e11..e9dd273bd 100644 --- a/src/app/features/home/transaction/transaction.page.html +++ b/src/app/features/home/activities/capture-transactions/capture-transactions.component.html @@ -1,10 +1,3 @@ - - - {{ t('transaction') }} - -
{ + let component: CaptureTransactionsComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [CaptureTransactionsComponent], + imports: [IonicModule.forRoot(), SharedTestingModule], + }).compileComponents(); + + fixture = TestBed.createComponent(CaptureTransactionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }) + ); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/home/transaction/transaction.page.ts b/src/app/features/home/activities/capture-transactions/capture-transactions.component.ts similarity index 57% rename from src/app/features/home/transaction/transaction.page.ts rename to src/app/features/home/activities/capture-transactions/capture-transactions.component.ts index c59b68fb0..d2ca80c27 100644 --- a/src/app/features/home/transaction/transaction.page.ts +++ b/src/app/features/home/activities/capture-transactions/capture-transactions.component.ts @@ -1,18 +1,16 @@ import { Component } from '@angular/core'; -import { UntilDestroy } from '@ngneat/until-destroy'; import { catchError, map, shareReplay } from 'rxjs/operators'; -import { DiaBackendAuthService } from '../../../shared/dia-backend/auth/dia-backend-auth.service'; -import { DiaBackendTransactionRepository } from '../../../shared/dia-backend/transaction/dia-backend-transaction-repository.service'; -import { ErrorService } from '../../../shared/error/error.service'; -import { getStatus } from './transaction-details/transaction-details.page'; +import { DiaBackendAuthService } from '../../../../shared/dia-backend/auth/dia-backend-auth.service'; +import { DiaBackendTransactionRepository } from '../../../../shared/dia-backend/transaction/dia-backend-transaction-repository.service'; +import { ErrorService } from '../../../../shared/error/error.service'; +import { getStatus } from '../capture-transaction-details/capture-transaction-details.page'; -@UntilDestroy({ checkProperties: true }) @Component({ - selector: 'app-transaction', - templateUrl: './transaction.page.html', - styleUrls: ['./transaction.page.scss'], + selector: 'app-capture-transactions', + templateUrl: './capture-transactions.component.html', + styleUrls: ['./capture-transactions.component.scss'], }) -export class TransactionPage { +export class CaptureTransactionsComponent { readonly transactionsWithStatus$ = this.diaBackendTransactionRepository.all$.pipe( catchError((err: unknown) => this.errorService.toastError$(err)), diff --git a/src/app/features/home/activities/network-action-orders/network-action-orders.component.html b/src/app/features/home/activities/network-action-orders/network-action-orders.component.html new file mode 100644 index 000000000..7a32328b9 --- /dev/null +++ b/src/app/features/home/activities/network-action-orders/network-action-orders.component.html @@ -0,0 +1,28 @@ + + + + +
{{ order.network_app_name_text }}
+
{{ order.asset_id_text }}
+
{{ order['Created Date'] | date: 'short' }}
+ +
+ +
+
diff --git a/src/app/features/home/activities/network-action-orders/network-action-orders.component.scss b/src/app/features/home/activities/network-action-orders/network-action-orders.component.scss new file mode 100644 index 000000000..f8fd79252 --- /dev/null +++ b/src/app/features/home/activities/network-action-orders/network-action-orders.component.scss @@ -0,0 +1,42 @@ +mat-list-item { + height: initial; + padding-top: 16px; + padding-bottom: 16px; + + img[matListAvatar] { + border-radius: 4px; + width: calc(100vw / 5); + height: calc(100vw / 8); + max-width: 150px; + max-height: 80px; + } + + button { + flex-shrink: 0; + min-width: 25%; + } + + button.completed { + color: var(--ion-color-dark-contrast); + border-color: var(--noir-simple); + background-color: var(--noir-simple); + } + + button.paid { + color: var(--noir-secondary-dark); + border-color: var(--noir-secondary-dark); + } + + button.submitted { + color: var(--ion-color-dark-contrast); + border-color: var(--noir-secondary-dark); + background-color: var(--noir-secondary-dark); + } + + button.failed, + button.payment_failed { + color: var(--ion-color-dark-contrast); + border-color: var(--noir-warn); + background-color: var(--noir-warn); + } +} diff --git a/src/app/features/home/activities/network-action-orders/network-action-orders.component.spec.ts b/src/app/features/home/activities/network-action-orders/network-action-orders.component.spec.ts new file mode 100644 index 000000000..82f350ebf --- /dev/null +++ b/src/app/features/home/activities/network-action-orders/network-action-orders.component.spec.ts @@ -0,0 +1,26 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; +import { SharedTestingModule } from '../../../../shared/shared-testing.module'; +import { NetworkActionOrdersComponent } from './network-action-orders.component'; + +describe('NetworkActionOrdersComponent', () => { + let component: NetworkActionOrdersComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [NetworkActionOrdersComponent], + imports: [IonicModule.forRoot(), SharedTestingModule], + }).compileComponents(); + + fixture = TestBed.createComponent(NetworkActionOrdersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }) + ); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/home/activities/network-action-orders/network-action-orders.component.ts b/src/app/features/home/activities/network-action-orders/network-action-orders.component.ts new file mode 100644 index 000000000..5028e84b6 --- /dev/null +++ b/src/app/features/home/activities/network-action-orders/network-action-orders.component.ts @@ -0,0 +1,77 @@ +import { Component } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import { combineLatest, EMPTY } from 'rxjs'; +import { first, map, pluck } from 'rxjs/operators'; +import { + ActionsService, + BubbleOrderHistoryRecord, +} from '../../../../shared/actions/service/actions.service'; +import { DiaBackendAssetRepository } from '../../../../shared/dia-backend/asset/dia-backend-asset-repository.service'; +import { DiaBackendTransactionRepository } from '../../../../shared/dia-backend/transaction/dia-backend-transaction-repository.service'; +import { Proof } from '../../../../shared/repositories/proof/proof'; +import { ProofRepository } from '../../../../shared/repositories/proof/proof-repository.service'; +@UntilDestroy({ checkProperties: true }) +@Component({ + selector: 'app-network-action-orders', + templateUrl: './network-action-orders.component.html', + styleUrls: ['./network-action-orders.component.scss'], +}) +export class NetworkActionOrdersComponent { + readonly networkActionOrders$ = combineLatest([ + this.proofRepository.all$, + this.actionsService.getOrdersHistory$(), + ]).pipe( + first(), + map(([proofs, orders]) => { + orders.map(order => { + order.assetThumbnailUrl$ = this.fetchThumbnailUrl$(proofs, order); + }); + return orders; + }), + untilDestroyed(this) + ); + + constructor( + private readonly proofRepository: ProofRepository, + private readonly actionsService: ActionsService, + private readonly sanitizer: DomSanitizer, + private readonly diaBackendTransactionRepository: DiaBackendTransactionRepository, + private readonly diaBackendAssetRepository: DiaBackendAssetRepository + ) {} + + fetchThumbnailUrl$(proofs: Proof[], order: BubbleOrderHistoryRecord) { + // Since Web 3.0 Archive is actually a Capture transaction, grab the thumbnail from + // `/transactions/{id}/` endpoint. + if (order.network_app_name_text.includes('Web 3.0 Archive')) { + if (order.result_tx_text) + return this.diaBackendTransactionRepository + .fetchById$(order.result_tx_text) + .pipe(pluck('asset'), pluck('asset_file_thumbnail')); + return EMPTY; + } + + const proof = proofs.find( + proof => proof.diaBackendAssetId === order.asset_id_text + ); + + return proof + ? proof.thumbnailUrl$.pipe( + map(url => { + if (url) return this.sanitizer.bypassSecurityTrustUrl(url); + return EMPTY; + }) + ) + : this.diaBackendAssetRepository + .fetchById$(order.asset_id_text) + .pipe(pluck('asset_file_thumbnail')); + } + + // eslint-disable-next-line class-methods-use-this + trackNetworkActionOrderHistoryRecords( + _: number, + item: BubbleOrderHistoryRecord + ) { + return item._id; + } +} diff --git a/src/app/features/home/details/actions/actions.page.ts b/src/app/features/home/details/actions/actions.page.ts index 874d9a798..f55ddad99 100644 --- a/src/app/features/home/details/actions/actions.page.ts +++ b/src/app/features/home/details/actions/actions.page.ts @@ -16,7 +16,7 @@ import { BlockingActionService } from '../../../../shared/blocking-action/blocki import { DiaBackendAuthService } from '../../../../shared/dia-backend/auth/dia-backend-auth.service'; import { DiaBackendStoreService, - NetworkAppOrderStatus, + NetworkAppOrder, } from '../../../../shared/dia-backend/store/dia-backend-store.service'; import { ErrorService } from '../../../../shared/error/error.service'; import { OrderDetailDialogComponent } from '../../../../shared/order-detail-dialog/order-detail-dialog.component'; @@ -80,7 +80,7 @@ export class ActionsPage { ); } - openOrderDialog$(orderStatus: NetworkAppOrderStatus) { + openOrderDialog$(orderStatus: NetworkAppOrder) { const dialogRef = this.dialog.open( OrderDetailDialogComponent, { @@ -120,7 +120,21 @@ export class ActionsPage { ); } + createOrderHistory$(networkAppOrder: NetworkAppOrder) { + return this.id$.pipe( + first(), + isNonNullable(), + concatMap(cid => + this.actionsService.createOrderHistory$(networkAppOrder, cid) + ), + catchError((err: unknown) => { + return this.errorService.toastError$(err); + }) + ); + } + doAction(action: Action) { + let networkAppOrder: NetworkAppOrder; this.openActionDialog$(action) .pipe( concatMap(createOrderInput => @@ -131,7 +145,11 @@ export class ActionsPage { ) ) ), - concatMap(orderStatus => this.openOrderDialog$(orderStatus)), + concatMap(orderStatus => { + networkAppOrder = orderStatus; + return this.openOrderDialog$(orderStatus); + }), + tap(() => this.createOrderHistory$(networkAppOrder).subscribe()), concatMap(orderId => this.blockingActionService.run$(this.confirmOrder$(orderId)) ), diff --git a/src/app/features/home/home-routing.module.ts b/src/app/features/home/home-routing.module.ts index 185785553..fd87a9764 100644 --- a/src/app/features/home/home-routing.module.ts +++ b/src/app/features/home/home-routing.module.ts @@ -13,9 +13,9 @@ const routes: Routes = [ import('./inbox/inbox.module').then(m => m.InboxPageModule), }, { - path: 'transaction', + path: 'activities', loadChildren: () => - import('./transaction/transaction.module').then( + import('./activities/activities.module').then( m => m.TransactionPageModule ), }, diff --git a/src/app/features/home/home.page.html b/src/app/features/home/home.page.html index a7cdee91a..16580d11b 100644 --- a/src/app/features/home/home.page.html +++ b/src/app/features/home/home.page.html @@ -46,7 +46,7 @@ menu -