UNPKG

copay-crown

Version:

A Secure Crown Wallet

245 lines (226 loc) 9.24 kB
<ion-header> <ion-toolbar> <ion-title> {{'Payment Proposal' | translate}} </ion-title> <ion-buttons start> <button (click)="close()" ion-button> {{'Close' | translate}} </button> </ion-buttons> </ion-toolbar> </ion-header> <ion-content no-bounce> <div padding> <div class="sending-label"> <img class="sending-img" src="assets/img/icon-tx-sent-outline.svg"> <span translate>Sending</span> </div> <div class="amount-label"> <div class="amount">{{tx.amountStr}}</div> <div class="alternative" *ngIf="tx.alternativeAmountStr">{{tx.alternativeAmountStr}}</div> </div> </div> <ion-item *ngIf="tx && tx.removed" text-wrap> <span translate>The payment was removed by creator</span> </ion-item> <div *ngIf="tx && tx.status != 'pending'"> <div *ngIf="tx && tx.status == 'accepted' && !tx.isGlidera"> <ion-item text-wrap translate>Payment accepted, but not yet broadcasted</ion-item> <button ion-item class="btn-broadcast" icon-left (click)="broadcast(tx)" [disabled]="loading"> <ion-icon name="cloud-upload"></ion-icon> <span translate>Broadcast Payment</span> </button> </div> <ion-item *ngIf="tx && tx.status == 'accepted' && tx.isGlidera" text-wrap> <span translate>Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created.</span> </ion-item> <ion-item *ngIf="tx && tx.status == 'broadcasted'" text-wrap translate>Payment Sent</ion-item> <ion-item *ngIf="tx && tx.status =='rejected'" text-wrap translate>Payment Rejected</ion-item> </div> <ion-item *ngIf="!currentSpendUnconfirmed && tx && tx.hasUnconfirmedInputs"> <span translate>Warning: this transaction has unconfirmed inputs</span> </ion-item> <ion-list> <ion-item-divider>{{'To' | translate}}</ion-item-divider> <ion-item class="container-to"> <div class="payment-proposal-to" copy-to-clipboard="{{tx.toAddress}}"> <img class="icon-bitcoin" src="assets/img/icon-bitcoin-small.svg" /> <!-- <contact ng-if="!tx.hasMultiplesOutputs" class="ellipsis" address="{{tx.toAddress}}"></contact> TODO --> <span *ngIf="tx && !tx.name">{{tx.toAddress}}</span> <span *ngIf="tx && tx.name">{{tx.name}}</span> <span *ngIf="tx && tx.hasMultiplesOutputs" translate>Multiple recipients</span> </div> <div *ngIf="tx && tx.hasMultiplesOutputs" (click)="showMultiplesOutputs = !showMultiplesOutputs"> <span translate>Recipients</span> <span>{{tx.recipientCount}} <ion-icon name="arrow-up"></ion-icon> </span> </div> <div *ngIf="tx && tx.hasMultiplesOutputs && showMultiplesOutputs"> <div *ngFor="let output of tx.outputs"> <div class="item" copy-to-clipboard="{{output.toAddress}}"> <span translate>To</span>: <span>{{output.toAddress || output.address}}</span> </div> <div class="item"> <span translate>Amount</span>: <span>{{output.amountStr}} <span *ngIf="output.alternativeAmountStr">({{output.alternativeAmountStr}})</span> </span> </div> <div class="item" *ngIf="output.message"> <span translate>Note</span>: <span>{{output.message}}</span> </div> </div> </div> </ion-item> <ion-item-divider>{{'From' | translate}}</ion-item-divider> <ion-item class="container-from"> <div class="wallet" *ngIf="wallet"> <img class="icon-wallet" src="assets/img/icon-wallet.svg" /> <div>{{wallet.name}}</div> </div> </ion-item> <ion-item-divider></ion-item-divider> <ion-item *ngIf="isShared"> <ion-label> <span translate>Created by</span> </ion-label> <ion-note item-end> <span>{{tx.creatorName}}</span> </ion-note> </ion-item> <ion-item *ngIf="tx && tx.ts || tx.createdOn"> <ion-label> <span translate>Date</span> </ion-label> <ion-note item-end> <time>{{ (tx.ts || tx.createdOn ) * 1000 | amDateFormat:'MM/DD/YYYY hh:mm a'}}</time> </ion-note> </ion-item> <div *ngIf="tx && tx.message"> <ion-item-divider>{{'Memo' | translate}}</ion-item-divider> <ion-item text-wrap> {{tx.message}} </ion-item> <ion-item-divider></ion-item-divider> </div> <ion-item *ngIf="tx && tx.feeStr"> <ion-label> <div class="item-title">{{'Fee' | translate}}</div> <div class="item-subtitle">{{tx.feelevelstr | translate}}</div> </ion-label> <ion-note item-end> <span>{{tx.feeStr}}</span> <div>{{tx.feeFiatStr}} <span *ngIf="tx.feeRateStr">({{tx.feeRateStr}})</span> </div> </ion-note> </ion-item> <div *ngIf="tx && tx.paypro"> <ion-item-divider>{{'Payment request' | translate}}</ion-item-divider> <ion-item> <ion-label> {{'Pay To'|translate}} </ion-label> <ion-note item-end> {{tx.paypro.domain}} </ion-note> </ion-item> <ion-item> <ion-label> {{'Certified by'|translate}} </ion-label> <ion-note *ngIf="tx.paypro.caTrusted" icon-start item-end text-wrap> <ion-icon *ngIf="tx.paypro.verified" color="success" name="lock"></ion-icon> <ion-icon *ngIf="!tx.paypro.verified" color="warning" name="unlock"></ion-icon> {{tx.paypro.caName}} {{'(Trusted)' | translate}} </ion-note> <ion-note *ngIf="!tx.paypro.caTrusted" icon-start item-end text-wrap> <span *ngIf="tx.paypro.selfSigned"> <ion-icon color="danger" name="unlock"></ion-icon> <span translate>Self-signed Certificate</span> </span> <span *ngIf="!tx.paypro.selfSigned"> <ion-icon color="warning" name="lock"></ion-icon> {{tx.paypro.caName}} <br> <span translate>WARNING: UNTRUSTED CERTIFICATE</span> </span> </ion-note> </ion-item> <ion-item *ngIf="paymentExpired"> <ion-label> {{'Expired'|translate}} </ion-label> <ion-note color="danger" item-end> <time>{{tx.paypro.expires * 1000 | amTimeAgo }}</time> </ion-note> </ion-item> <ion-item *ngIf="!paymentExpired"> <ion-label> {{'Expires'|translate}} </ion-label> <ion-note item-end> <time>{{expires}}</time> </ion-note> </ion-item> <ion-item-divider *ngIf="tx.paypro.memo">{{'Merchant Message' | translate}}</ion-item-divider> <ion-item *ngIf="tx.paypro.memo" text-wrap> {{tx.paypro.memo}} </ion-item> </div> <div *ngIf="actionList && actionList[0]"> <ion-item-divider>{{'Timeline' | translate}}</ion-item-divider> <div class="timeline-item" [ngClass]="{'action-created' : a.type == 'created' || a.type == 'accept', 'action-rejected' : a.type == 'reject'}" *ngFor="let a of actionList; let i = index"> <div class="timeline-content"> <div class="timeline-content-icon"> <div class="rejected" *ngIf="a.type === 'reject'">!</div> <div class="line" *ngIf="a.type !== 'reject'">{{actionList.length - i}}</div> </div> <div class="timeline-content-label"> <div class="action">{{a.description}}</div> <div class="name">{{a.by}}</div> </div> <ion-note> <time>{{ a.time * 1000 | amTimeAgo}}</time> </ion-note> </div> </div> </div> <div *ngIf="(tx && tx.canBeRemoved) || (tx && tx.status == 'accepted' && !tx.broadcastedOn)"> <div class="proposal-deletion-help" *ngIf="!tx.isGlidera && isShared" translate> * A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created. </div> <ion-item-divider></ion-item-divider> <button ion-item icon-left text-center class="btn-remove" (click)="remove()" [disabled]="loading"> <ion-icon name="trash"></ion-icon> <span translate>Delete Payment Proposal</span> </button> </div> <ion-item-divider></ion-item-divider> </ion-list> </ion-content> <ion-footer> <div *ngIf="(isShared && tx && tx.pendingForUs && !paymentExpired) || (tx && tx.pendingForUs && canSign && !paymentExpired)"> <ion-toolbar> <ion-buttons left> <button ion-button icon-left (click)="reject()" [disabled]="loading" color="warning" *ngIf="isShared && tx.pendingForUs && !paymentExpired"> <ion-icon name="close"></ion-icon> {{'Reject'| translate}} </button> </ion-buttons> <ion-buttons right> <button *ngIf="tx && tx.pendingForUs && canSign && !paymentExpired" color="blank" ion-button icon-right (click)="onConfirm()"> {{buttonText}} <ion-icon name="send"></ion-icon> </button> </ion-buttons> </ion-toolbar> </div> </ion-footer>