pulled in latest commits from yesterday, merged and handled conflicts

This commit is contained in:
Jamal Jackson 2016-09-01 08:59:37 -04:00
commit f15d597b25
123 changed files with 1686 additions and 1291 deletions

View file

@ -42,7 +42,7 @@
"url": "https://github.com/bitpay/copay/issues"
},
"dependencies": {
"bitcore-wallet-client": "4.0.0",
"bitcore-wallet-client": "4.1.0",
"coveralls": "^2.11.9",
"express": "^4.11.2",
"fs": "0.0.2",

View file

@ -1,11 +1,11 @@
{
{
"//":"PLEASE! Do not edit this file directly",
"//":" Modify it at app-template/",
"//":" Modify it at app-template/",
"manifest_version": 2,
"name": "BitPay",
"description": "The BitPay Bitcoin Wallet",
"version": "0.6.0",
"version": "0.7.0",
"permissions": [
"storage",
"unlimitedStorage",

View file

@ -6,7 +6,7 @@
"name": "bitpay",
"description": "The BitPay Bitcoin Wallet",
"author": "BitPay",
"version": "0.6.0",
"version": "0.7.0",
"keywords": [
"wallet",
"copay",
@ -45,7 +45,7 @@
"url": "https://github.com/bitpay/copay/issues"
},
"dependencies": {
"bitcore-wallet-client": "4.0.0",
"bitcore-wallet-client": "4.1.0",
"coveralls": "^2.11.9",
"express": "^4.11.2",
"fs": "0.0.2",

28
public/img/icon-backup.svg Executable file
View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="51px" height="51px" viewBox="0 0 51 51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
<title>item-ico-backup</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M25.1597034,50.388592 C39.0550239,50.388592 50.3194068,39.1087215 50.3194068,25.194296 C50.3194068,11.2798705 39.0550239,0 25.1597034,0 C11.2643829,0 0,11.2798705 0,25.194296 C0,39.1087215 11.2643829,50.388592 25.1597034,50.388592 Z" id="path-1"></path>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Wallet/Icon/Backup" transform="translate(-1.000000, -1.000000)">
<g id="item-ico-backup" transform="translate(1.000000, 1.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#647CE8" xlink:href="#path-1"></use>
<g id="arrows-24px-outline-4_restore" mask="url(#mask-2)">
<g transform="translate(13.000000, 14.000000)" id="Group">
<g>
<polyline id="Shape" stroke="#FFFFFF" points="12 6 12 12 16.8 16.8"></polyline>
<path d="M0,12 C0,18.6 5.4,24 12,24 C18.6,24 24,18.6 24,12 C24,5.4 18.6,0 12,0 C7.32,0 3.24,2.64 1.32,6.6" id="Shape" stroke="#FFFFFF"></path>
<polyline id="Shape" stroke="#FFFFFF" points="0.3168 0.684 1.32 6.6 7.236 5.5968"></polyline>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

24
public/img/icon-bitcoin.svg Executable file
View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="51px" height="51px" viewBox="0 0 51 51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
<title>item-ico-bitcoin</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="63.5606697%" y1="66.5486774%" x2="29.0167968%" y2="6.87818453%" id="linearGradient-1">
<stop stop-color="#FFA24B" offset="0%"></stop>
<stop stop-color="#F7891C" offset="100%"></stop>
</linearGradient>
<path d="M25.1597034,50.388592 C39.0550239,50.388592 50.3194068,39.1087215 50.3194068,25.194296 C50.3194068,11.2798705 39.0550239,0 25.1597034,0 C11.2643829,0 0,11.2798705 0,25.194296 C0,39.1087215 11.2643829,50.388592 25.1597034,50.388592 Z" id="path-2"></path>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Wallet/Icon/Bitcoin" transform="translate(-1.000000, -1.000000)">
<g id="item-ico-bitcoin" transform="translate(1.000000, 1.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<use id="Mask" fill="url(#linearGradient-1)" xlink:href="#path-2"></use>
<path d="M32.5251708,19.1369572 C31.8948853,16.0886456 29.257137,15.2921976 26.0055297,15.2593441 L25.5453174,11 L23.0555529,11.2090294 L23.5134657,15.373126 C22.8550964,15.4317519 22.1899109,15.4927249 21.5389325,15.5728157 L21.0810197,11.4087191 L18.5639908,11.6271364 L19.0242031,15.8864805 C18.491562,15.9338279 17.9619595,16.0121421 17.4293184,16.0594894 L17.4293184,16.0594894 L14,16.3519349 L14.3001563,19.1057521 C14.3001563,19.1057521 16.1464976,18.9101859 16.097471,18.9670835 C17.1082244,18.8911646 17.5047081,19.4669358 17.6381561,19.9652087 L18.1721961,24.815384 C18.2433956,24.8228812 18.3251888,24.7947176 18.4359709,24.8286017 C18.337507,24.8304924 18.2829782,24.8492682 18.1845144,24.8511589 L18.9620463,31.6263154 C18.9496461,31.9667227 18.8043732,32.4969407 18.1187395,32.5649545 C18.1558585,32.5841865 16.2873443,32.7153579 16.2873443,32.7153579 L16.1570191,35.8575 L19.3937622,35.5593341 C19.9976027,35.5194839 20.5915887,35.4510138 21.1638124,35.4300534 L21.636343,39.7251724 L24.1261075,39.516143 L23.6658952,35.2567989 C24.3681996,35.2150579 25.0290326,35.163587 25.6601376,35.1143489 L26.1104953,39.3450731 L28.6002598,39.1360437 L28.1277292,34.8409248 C32.2914614,34.2235708 35.0997752,32.8804369 34.9972849,28.7300142 C34.9241947,25.4178154 33.2949822,24.0740188 30.8224629,23.6688612 C32.2236222,22.7782364 32.9706,21.3605564 32.5251708,19.1369572 L32.5251708,19.1369572 Z M30.0403391,28.6601004 C30.3997054,31.8737265 25.0597443,31.9757118 23.3838054,32.1126037 L22.7467022,26.4095523 C24.4523691,26.2704275 29.6589641,25.2939871 30.0403391,28.6601004 L30.0403391,28.6601004 Z M22.4636273,23.7939125 L21.9147231,18.6127177 C23.3026612,18.5029629 27.6736684,17.6461697 28.0060987,20.6929985 C28.3307274,23.6064579 23.8812935,23.6819248 22.4636273,23.7939125 Z" id="Bitcoin_Symbol" fill="#FFFFFF" mask="url(#mask-3)"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="51px" height="51px" viewBox="0 0 51 51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
<title>Oval 87 + bitpay-logo-grayscale</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Wallet/Icon/BitPay">
<g id="Oval-87-+-bitpay-logo-grayscale" transform="translate(0.255973, 0.209302)">
<ellipse id="Oval-87" fill="#2F2EAA" cx="25.1597034" cy="25.194296" rx="25.1597034" ry="25.194296"></ellipse>
<path d="M28.4160311,19.6561996 C29.5705304,19.6561996 30.5875893,19.8806427 31.4397197,20.3014735 C32.2918501,20.7223043 32.979052,21.283412 33.5563016,22.0128521 C34.1060632,22.7422921 34.5183844,23.5839537 34.7932651,24.5378368 C35.0681459,25.4917199 35.2055863,26.5297692 35.2055863,27.6519847 C35.2055863,29.3633632 34.9032175,30.9625202 34.2709917,32.5055664 C33.6387659,34.0205573 32.8141235,35.3672158 31.7420885,36.4894312 C30.6700535,37.6116467 29.4056019,38.509419 27.9487338,39.1546929 C26.4918657,39.7999668 24.9250453,40.1366314 23.2207844,40.1366314 C23.0008798,40.1366314 22.6160467,40.1366314 22.0662852,40.108576 C21.5165236,40.108576 20.8842978,40.0524653 20.1970959,39.9402437 C19.4824059,39.8280222 18.7402278,39.6877452 17.9705616,39.4913575 C17.1734073,39.2949698 16.4312292,39.014416 15.7440273,38.6777513 L22.0387971,11.68847 L27.673853,10.7906977 L25.4473187,20.3575843 C25.9421041,20.1331412 26.3819134,19.9648089 26.8766988,19.8525873 C27.3439961,19.7123104 27.8662696,19.6561996 28.4160311,19.6561996 L28.4160311,19.6561996 Z M23.6880818,35.5355481 C24.5402122,35.5355481 25.3373664,35.3391604 26.0795445,34.8902742 C26.8217226,34.4694435 27.4814365,33.9083357 28.031198,33.2069511 C28.5809596,32.5055664 29.0207688,31.6919602 29.3231377,30.8222433 C29.6255065,29.9244709 29.790435,28.9986432 29.790435,28.0447601 C29.790435,26.8664338 29.5980185,25.9406061 29.2131854,25.2672768 C28.8283523,24.5939476 28.031198,24.2853383 26.9866511,24.2853383 C26.6567941,24.2853383 26.2994491,24.3133937 25.7496876,24.4536707 C25.199926,24.5658922 24.7326287,24.8464461 24.2928195,25.2392215 L21.9288448,35.4233266 C22.6435348,35.5355481 22.8634394,35.5636035 23.055856,35.5636035 C23.1932964,35.5355481 23.413201,35.5355481 23.6880818,35.5355481 L23.6880818,35.5355481 Z" id="b_2_" fill="#FFFFFF"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

30
public/img/icon-gift.svg Executable file
View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="51px" height="51px" viewBox="0 0 51 51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
<title>item-ico-gift</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="0%" y1="0%" x2="101.999998%" y2="100.999999%" id="linearGradient-1">
<stop stop-color="#3023AE" offset="0%"></stop>
<stop stop-color="#C96DD8" offset="100%"></stop>
</linearGradient>
<ellipse id="path-2" cx="25.1597034" cy="25.194296" rx="25.1597034" ry="25.194296"></ellipse>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Wallet/Icon/Gifts" transform="translate(-1.000000, -1.000000)">
<g id="item-ico-gift" transform="translate(1.000000, 1.000000)">
<g id="Group">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<use id="Mask" fill="url(#linearGradient-1)" xlink:href="#path-2"></use>
<polyline id="Shape" stroke="#FFFFFF" mask="url(#mask-3)" points="34.9090909 22.3636364 34.9090909 37 16.0909091 37 16.0909091 22.3636364"></polyline>
<rect id="Rectangle-path" stroke="#FFFFFF" mask="url(#mask-3)" x="14" y="18.1818182" width="23" height="4.18181818"></rect>
<path d="M19.2272727,16.0909091 C19.2272727,14.9356818 20.1629545,14 21.3181818,14 C24.4106364,14 25.5,18.1818182 25.5,18.1818182 L21.3181818,18.1818182 C20.1629545,18.1818182 19.2272727,17.2461364 19.2272727,16.0909091 L19.2272727,16.0909091 Z" id="Shape" stroke="#FFFFFF" mask="url(#mask-3)"></path>
<path d="M31.7727273,16.0909091 C31.7727273,14.9356818 30.8370455,14 29.6818182,14 C26.5893636,14 25.5,18.1818182 25.5,18.1818182 L29.6818182,18.1818182 C30.8370455,18.1818182 31.7727273,17.2461364 31.7727273,16.0909091 L31.7727273,16.0909091 Z" id="Shape" stroke="#FFFFFF" mask="url(#mask-3)"></path>
<polyline id="Shape" stroke="#FFFFFF" mask="url(#mask-3)" points="27.5909091 18.1818182 27.5909091 37 23.4090909 37 23.4090909 18.1818182"></polyline>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -1,21 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-285 410.9 25 20"
style="enable-background:new -285 410.9 25 20;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<title>Wallet-Copy</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" sketch:type="MSPage">
<g id="Navigation-13-Copy-2" transform="translate(-25.000000, -285.000000)" sketch:type="MSArtboardGroup">
<g id="wallet-ico-copy-2" transform="translate(26.042969, 286.000000)" sketch:type="MSLayerGroup">
<path class="st0" d="M-261.8,428.9h-23.5l0-18.2l18-0.1v2.8h5.5V428.9z M-284.7,428.3h22.4V414h-4.9l-0.3,0.1h-17.1V428.3z
M-284.7,413.4h16.8v-2.2l-16.8,0.1V413.4z M-266.4,424c-1,0-1.7-0.8-1.7-1.7s0.8-1.7,1.7-1.7s1.7,0.8,1.7,1.7
S-265.4,424-266.4,424z M-266.4,421.1c-0.6,0-1.2,0.5-1.2,1.1s0.5,1.1,1.2,1.1c0.6,0,1.2-0.5,1.2-1.1S-265.8,421.1-266.4,421.1z"
/>
</g>
</g>
</g>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="44px" height="38px" viewBox="0 0 44 38" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 39.1 (31720) - http://www.bohemiancoding.com/sketch -->
<title>Wallet Copy</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M12.2206319,33.5295725 C12.2206319,35.1887012 13.5540503,36.5336907 15.221911,36.5336908 L35.3827914,36.5336913 C37.040352,36.5336913 38.3840705,35.1979548 38.3840705,33.529573 L38.3840709,19.5110705 L12.2206319,19.5110706 L12.2206319,33.5295725 Z M31.7761235,19.4691743 L31.776124,16.3165791 L12.2255864,16.3165791 C12.2255864,16.3165791 12.2255864,19.5085877 12.2255864,19.5085877 L31.7761235,19.4691743 Z M33.423217,30.9126651 C34.3328814,30.9126651 35.07031,30.1815053 35.07031,29.279574 C35.07031,28.3776426 34.3328814,27.6464828 33.423217,27.6464828 C32.5135527,27.6464828 31.776124,28.3776426 31.776124,29.279574 C31.776124,30.1815053 32.5135527,30.9126651 33.423217,30.9126651 Z" id="path-1"></path>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-2">
<feMorphology radius="0.5" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
<feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
<feMorphology radius="1" operator="erode" in="SourceAlpha" result="shadowInner"></feMorphology>
<feOffset dx="0" dy="2" in="shadowInner" result="shadowInner"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="shadowInner" operator="out" result="shadowOffsetOuter1"></feComposite>
<feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.307518116 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Wallet/Icon/Blue" transform="translate(-3.000000, -10.000000)">
<g id="Oval-87-+-bitpay-logo-grayscale" transform="translate(0.000000, 1.000000)">
<g id="Wallet-Copy">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use stroke="#FFFFFF" stroke-width="1" xlink:href="#path-1"></use>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before After
Before After

202
public/roboto-font/LICENSE.txt Executable file
View file

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -19,7 +19,7 @@
<div ng-if="!fetchingNotifications">
<div class="list card">
<div class="item item-icon-left" ng-repeat="x in notifications" ng-click="x.action()">
<div class="item" ng-repeat="x in notifications" ng-click="x.action()">
<span ng-include="'views/includes/walletActivity.html'"></span>
</div>

View file

@ -1,26 +1,26 @@
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-bar>
<ion-nav-title>{{'Add wallet' | translate}}</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="tabs.home">
Close
<i class="icon ion-chevron-left"></i> {{'Back' | translate}}
</button>
</ion-nav-buttons>
<ion-nav-title>Add wallet</ion-nav-title>
</ion-nav-bar>
<ion-content>
<ion-list>
<ion-item class="item-remove-animate item-icon-right" type="item-text-wrap" ui-sref="add.create.personal">
<ion-item class="item-remove-animate item-icon-right" type="item-text-wrap" ui-sref="tabs.create.personal">
<h2 translate>Create new wallet</h2>
<i class="icon ion-chevron-right icon-accessory"></i>
</ion-item>
<ion-item class="item-remove-animate item-icon-right" type="item-text-wrap" ui-sref="add.join">
<ion-item class="item-remove-animate item-icon-right" type="item-text-wrap" ui-sref="tabs.join">
<h2 translate>Join shared wallet</h2>
<i class="icon ion-chevron-right icon-accessory"></i>
</ion-item>
<ion-item class="item-remove-animate item-icon-right" type="item-text-wrap" ui-sref="add.import.phrase">
<ion-item class="item-remove-animate item-icon-right" type="item-text-wrap" ui-sref="tabs.import.phrase">
<h2 translate>Import wallet</h2>
<i class="icon ion-chevron-right icon-accessory"></i>
</ion-item>

View file

@ -1,22 +1,16 @@
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-title>Enter Amount</ion-nav-title>
<ion-nav-bar>
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="tabs.send">
<i class="icon ion-chevron-left"></i> Back
<button class="button no-border" ng-click="$ionicGoBack()">
<i class="icon ion-chevron-left"></i> {{'Back' | translate}}
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-pane>
<ion-content class="calculator" scroll="false" class="amount" ng-controller="amountController" ng-init="init()">
<ion-content class="calculator" scroll="false" class="amount" ng-controller="amountController" ng-init="init()">
<div class="card">
<div class="item item-divider">
Recipient
</div>
<div class="item item-divider" translate>Recipient</div>
<div class="item item-text-wrap item-icon-left">
<i class="icon ion-ios-person-outline"></i>
@ -25,24 +19,20 @@
</div>
<div class="card">
<div class="item item-divider">
Amount
</div>
<div class="item item-divider" translate>Amount</div>
<div class="item item-text-wrap item-button-right">
<a class="postfix" ng-click="toggleAlternative()" ng-show="showAlternativeAmount">{{alternativeIsoCode}}</a>
<a class="postfix" ng-click="toggleAlternative()" ng-show="!showAlternativeAmount">{{unitName}}</a>
<a class="postfix" ng-click="toggleAlternative()" ng-show="showAlternativeAmount">{{alternativeIsoCode}}</a>
<a class="postfix" ng-click="toggleAlternative()" ng-show="!showAlternativeAmount">{{unitName}}</a>
<div class="text-light text-black m15b" ng-class="{'size-28': smallFont, 'size-36': !smallFont}"> <span> {{amount || "0.00" }}</div>
<div class="text-light text-black" ng-class="{'size-16': smallFont, 'size-17': !smallFont}" ng-show="!showAlternativeAmount">
{{globalResult}} <span class="label gray text-white radius">{{amountResult || '0.00'}} {{alternativeIsoCode}}</span>
</div>
<div class="text-light text-black size-17" ng-show="showAlternativeAmount">
{{globalResult}} <span class="label gray text-white radius">{{alternativeResult || '0.00'}} {{unitName}}</span>
</div>
<div class="text-light text-black m15b" ng-class="{'size-28': smallFont, 'size-36': !smallFont}"><span> {{amount || "0.00" }}</div>
<div class="text-light text-black" ng-class="{'size-16': smallFont, 'size-17': !smallFont}" ng-show="!showAlternativeAmount">
{{globalResult}} <span class="label gray text-white radius">{{amountResult || '0.00'}} {{alternativeIsoCode}}</span>
</div>
<div class="text-light text-black size-17" ng-show="showAlternativeAmount">
{{globalResult}} <span class="label gray text-white radius">{{alternativeResult || '0.00'}} {{unitName}}</span>
</div>
</div>
</div>
<div class="button-calc">
@ -84,6 +74,5 @@
<div class="col columns operator" ng-click="pushOperator('-')">-</div>
</div>
</div>
</ion-content>
</ion-pane>
</ion-content>
</ion-view>

View file

@ -31,11 +31,6 @@
<span ng-show="!bitpayCard.bitpayCardTwoFactorPending">Login to your account</span>
<span ng-show="bitpayCard.bitpayCardTwoFactorPending">2-Step Verification</span>
</h4>
<div class="box-notification error"
ng-show="bitpayCard.error"
ng-click="bitpayCard.error = null">
{{bitpayCard.error}}
</div>
<form
ng-show="!bitpayCard.bitpayCardTwoFactorPending"
@ -121,14 +116,9 @@
<option value="all">All Activity</option>
</select>
<div class="box-notification error"
ng-show="bitpayCard.error">
{{bitpayCard.error}}
</div>
<div
class="oh pr m20t text-gray size-12 text-center"
ng-show="!bitpayCard.error && !bitpayCard.bitpayCardTransactionHistory[0] &&
ng-show="!bitpayCard.bitpayCardTransactionHistory[0] &&
!bitpayCard.bitpayCardInvoiceHistory[0] && !loadingHistory">
No transactions yet
</div>
@ -176,11 +166,6 @@
</div>
<div ng-show="bitpayCard.bitpayCardAuthenticated && !bitpayCard.visaCardActivated && addFunds">
<div class="box-notification error"
ng-show="bitpayCard.error"
ng-click="bitpayCard.error = null">
{{bitpayCard.error}}
</div>
<form
name="createInvoiceForm"
ng-submit="bitpayCard.sendFunds()"
@ -215,7 +200,7 @@
<div class="col">
<button class="button button-block button-stable"
type="button"
ng-click="addFunds = false; bitpayCard.error = null">
ng-click="addFunds = false">
Cancel
</button>
</div>

View file

@ -12,18 +12,15 @@
<div ng-show="!buy.giftCard">
<div class="box-notification error" ng-show="buy.error" ng-click="buy.error = null">
{{buy.error}}
<div ng-show="buy.errorInfo">
There was an error when trying to buy gift card, but the funds were sent to BitPay Invoice. Please, contact
BitPay to refund your bitcoin
<div>
Amount: {{buy.errorInfo.amount}} {{buy.errorInfo.currency}}<br>
BitPay Invoice ID: {{buy.errorInfo.invoiceId}}.
</div>
<div class="text-center">
<a ng-click="openExternalLink(buy.errorInfo.invoiceUrl)">Open invoice</a>
</div>
<div class="box-notification error" ng-show="buy.errorInfo" ng-click="buy.errorInfo = null">
There was an error when trying to buy gift card, but the funds were sent to BitPay Invoice. Please, contact
BitPay to refund your bitcoin
<div>
Amount: {{buy.errorInfo.amount}} {{buy.errorInfo.currency}}<br>
BitPay Invoice ID: {{buy.errorInfo.invoiceId}}.
</div>
<div class="text-center">
<a ng-click="openExternalLink(buy.errorInfo.invoiceUrl)">Open invoice</a>
</div>
</div>

View file

@ -10,12 +10,11 @@
<ion-content ng-controller="buyGlideraController as buy" ng-init="init()">
<div class="box-notification text-center size-12 text-warning" ng-show="network == 'testnet'">
<i class="fi-info"></i>
<div class="box-notification warning" ng-show="network == 'testnet'">
Testnet wallets only work with Glidera Sandbox Accounts
</div>
<h5 class="padding" ng-show="limits && !buy.show2faCodeInput && !buy.success">
<div class="box-notification notice" ng-show="limits && !buy.show2faCodeInput && !buy.success">
<span class="text-light">Daily buy limit</span>:
{{limits.dailyBuy|currency:'':2}} {{limits.currency}}
(remaining {{limits.dailyBuyRemaining|currency:'':2}} {{limits.currency}})
@ -23,7 +22,7 @@
<span class="text-light">Monthly buy limit</span>:
{{limits.monthlyBuy|currency:'':2}} {{limits.currency}}
(remaining {{limits.monthlyBuyRemaining|currency:'':2}} {{limits.currency}})
</h5>
</div>
<div class="box-notification m20b" ng-show="limits.transactDisabledPendingFirstTransaction && !buy.success">
<span class="text-warning">
@ -37,21 +36,6 @@
ng-submit="buy.get2faCode(token)" novalidate>
<div class="list">
<label class="item item-input item-stacked-label">
<span class="input-label">Wallet</span>
<input type="text"
id="address"
name="address"
ng-disabled="buy.selectedWalletId"
ng-attr-placeholder="{{'Choose your destination wallet'}}"
ng-model="buy.selectedWalletName" required>
<a on-tap="openWalletsModal(buy.allWallets)">
<i class="icon ion-briefcase size-18"></i>
</a>
</label>
<label class="item item-input item-stacked-label">
<span class="input-label">Amount in {{showAlternative ? 'USD' : 'BTC'}}</span>
<input ng-show="!showAlternative"
@ -81,6 +65,8 @@
class="postfix"
on-tap="showAlternative = false; fiat = null; buy.buyPrice = null">USD</a>
</label>
<wallets ng-if="wallets[0]" wallets="wallets"></wallets>
</div>
<div class="text-center text-gray size-12 m20b" ng-show="!buy.gettingBuyPrice && buy.buyPrice.qty">
@ -99,7 +85,7 @@
<button class="button button-block"
type="submit"
ng-disabled="limits.transactDisabledPendingFirstTransaction || !buy.buyPrice.qty || !buy.selectedWalletId || buy.loading">
ng-disabled="limits.transactDisabledPendingFirstTransaction || !buy.buyPrice.qty || buy.loading">
Continue
</button>
</form>
@ -128,11 +114,6 @@
</p>
</div>
</div>
<div class="box-notification m20b" ng-show="buy.error && !buy.success">
<span class="text-warning">
{{buy.error}}
</span>
</div>
<div class="text-center" ng-show="buy.success">
<h1>Purchase initiated</h1>
<p class="text-gray">

View file

@ -12,9 +12,6 @@
<ion-item class="item" ui-sref="glidera.main">
<img src="img/glidera-logo.png" width="100">
</ion-item>
<ion-item class="item" ui-sref="coinbase.main">
<img src="img/coinbase-logo.png" width="100"> TODO
</ion-item>
</ion-list>
</ion-content>
</ion-view>

View file

@ -1,61 +1,56 @@
<ion-view>
<ion-nav-bar>
<ion-nav-back-button>
{{'Back' | translate}}
</ion-nav-back-button>
</ion-nav-bar>
<ion-pane>
<ion-nav-bar class="bar-stable">
<ion-nav-title>Confirm</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="tabs.send">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-content scroll="false" ng-controller="confirmController" ng-init="init()">
<ion-content scroll="false" ng-controller="confirmController" ng-init="init()">
<div class="card">
<div class="item item-text-wrap">
<i class="icon ion-arrow-up-c"></i> <span class="text-bold size-16">Sending</span>
<div class="text-bold size-28 m15t">{{amountStr}} </div>
<div class="text-light size-20 m5t">{{alternativeAmountStr}} </div>
</div>
</div>
<div class="card">
<div class="item item-text-wrap">
<i class="icon ion-arrow-up-c"></i> <span class="text-bold size-16">Sending</span>
<div class="text-bold size-28 m15t">{{amountStr}} </div>
<div class="text-light size-20 m5t">{{alternativeAmountStr}} </div>
<div class="list card">
<div class="item">Fee: {{feeLevel}}
<span class="item-note">
{{fee || '...'}}
</span>
</div>
<div class="item item-icon-left">
<i class="icon ion-ios-person-outline"></i>
<label translate>To</label> {{toAddress}}
<p ng-show="toName">{{toName}}</p>
<div ng-show="_paypro" ng-click="openPPModal(_paypro)">
<i ng-show="_paypro.verified && _paypro.caTrusted" class="ion-locked" style="color:green"></i>
<i ng-show="!_paypro.caTrusted" class="ion-unlocked" style="color:red"></i>
{{_paypro.domain}}
</div>
</div>
<div class="list card">
<div class="item">Fee: {{feeLevel}}
<span class="item-note">
{{fee || '...'}}
</span>
</div>
<div class="item item-icon-left">
<i class="icon ion-ios-person-outline"></i>
<label translate>To</label> {{toAddress}}
<p ng-show="toName">{{toName}}</p>
<div ng-show="_paypro" ng-click="openPPModal(_paypro)">
<i ng-show="_paypro.verified && _paypro.caTrusted" class="ion-locked" style="color:green"></i>
<i ng-show="!_paypro.caTrusted" class="ion-unlocked" style="color:red"></i>
{{_paypro.domain}}
</div>
</div>
<div class="item">
<label translate>From</label>
<span class="badge badge-assertive" ng-show="notAvailable" translate>No wallet with enough funds</span>
</div>
<wallets ng-if="wallets[0]" wallets="wallets"></wallets>
<div class="item item-icon-left item-icon-right" ng-click="showDescriptionPopup()">
<span ng-show="!description">Add Description</span>
<span ng-show="description">{{description}}</span>
<i class="icon ion-ios-chatbubble-outline size-21"></i>
<i class="icon ion-ios-plus-empty size-21"></i>
</div>
<div class="item">
<label translate>From</label>
<span class="badge badge-assertive" ng-show="notAvailable" translate>No wallet with enough funds</span>
</div>
<button class="item button button-block button-balanced" ng-click="approve()" ng-disabled="!txp">
<span translate>Send</span>
</button>
</ion-content>
<wallets ng-if="wallets[0]" wallets="wallets"></wallets>
<div class="item item-icon-left item-icon-right" ng-click="showDescriptionPopup()">
<span ng-show="!description">Add Description</span>
<span ng-show="description">{{description}}</span>
<i class="icon ion-ios-chatbubble-outline size-21"></i>
<i class="icon ion-ios-plus-empty size-21"></i>
</div>
</div>
<button class="item button button-block button-balanced" ng-click="approve()" ng-disabled="!txp">
<span translate>Send</span>
</button>
</ion-content>
</ion-view>

View file

@ -1,11 +1,11 @@
<ion-view >
<ion-tabs class="tabs-striped tabs-color-positive tabs-color-active-positive tabs-top">
<ion-tab title="Personal Wallet" ui-sref="add.create.personal">
<ion-tab title="Personal Wallet" ui-sref="tabs.create.personal">
<ion-nav-view name="tab-create-personal"></ion-nav-view>
</ion-tab>
<ion-tab title="Shared Wallet" ui-sref="add.create.shared">
<ion-tab title="Shared Wallet" ui-sref="tabs.create.shared">
<ion-nav-view name="tab-create-shared"></ion-nav-view>
</ion-tab>

View file

@ -1,11 +1,11 @@
<ion-view >
<ion-tabs class="tabs-striped tabs-color-positive tabs-color-active-positive tabs-top">
<ion-tab title="File/Text" ui-sref="wallet.export.file">
<ion-tab title="File/Text" ui-sref="tabs.preferences.export.file">
<ion-nav-view name="tab-export-file"></ion-nav-view>
</ion-tab>
<ion-tab title="QR Code" ui-sref="wallet.export.qrCode">
<ion-tab title="QR Code" ui-sref="tabs.preferences.export.qrCode">
<ion-nav-view name="tab-export-qrCode"></ion-nav-view>
</ion-tab>

View file

@ -10,38 +10,14 @@
<ion-content ng-controller="glideraController as glidera" ng-init="init()">
<div class="box-notification text-center size-12 text-warning" ng-show="network == 'testnet'">
<i class="fi-info"></i>
<div class="box-notification warning" ng-show="network == 'testnet'">
Testnet wallets only work with Glidera Sandbox Accounts
</div>
<div class="m20b box-notification" ng-if="error">
<div class="text-warning">
<span>{{error}}</span>
</div>
</div>
<div class="m10t text-center" ng-show="error">
<button
class="button"
ng-show="error.indexOf('Forbidden') == 40"
ng-click="token = null; error = null">
Request a new token
</button>
<div ng-show="error.indexOf('Forbidden') != 40">
<button
class="button"
ng-click="init(token)">
Retry
</button>
<div class="m20t size-12">
<a class="text-gray" href ui-sref="glidera.preferences">Preferences</a>
</div>
</div>
</div>
<div ng-if="!token && !error">
<div ng-if="!token">
<div ng-init="showOauthForm = false">
<div class="text-center m20b">
<div class="text-center m20v">
<img src="img/glidera-logo.png" ng-click="update(token, permissions)" width="200">
</div>
<div class="text-center small-10 small-centered columns" ng-show="!showOauthForm">
@ -70,9 +46,6 @@
</div>
</div>
<div ng-show="showOauthForm">
<div class="text-left box-notification size-12 text-warning" ng-show="error">
{{error}}
</div>
<form name="oauthCodeForm" ng-submit="glidera.submitOauthCode(code)" novalidate>
<div class="list">
<label class="item item-input item-stacked-label">
@ -87,7 +60,7 @@
<input type="button"
value="Cancel"
class="button button-block"
ng-click="showOauthForm = false; error = null">
ng-click="showOauthForm = false">
</div>
<div class="col">
<input
@ -103,16 +76,17 @@
</div>
<div ng-if="token && permissions">
<div class="p20v text-center">
<img src="img/glidera-logo.png" ng-click="update(token, permissions)" width="100">
<div class="text-center m20v">
<img src="img/glidera-logo.png" ng-click="update(token, permissions)" width="200">
</div>
<div class="list">
<a class="item item-icon-left" href ui-sref="glidera.preferences">
<i class="icon ion-gear-a"></i>
<a class="item item-icon-left item-icon-right" href ui-sref="glidera.preferences">
<i class="icon ion-ios-gear"></i>
<span ng-show="personalInfo">{{personalInfo.firstName}} {{personalInfo.lastName}}</span>
<span class="item-note" ng-show="email">
{{email}}
</span>
<i class="icon ion-ios-arrow-right"></i>
</a>
</div>
<div class="padding">
@ -133,54 +107,56 @@
<div class="list"
ng-show="status && status.userCanTransact">
<a ng-show="status.userCanBuy"
class="item item-avatar"
class="item item-icon-right"
href ui-sref="glidera.buy">
<img src="img/buy-bitcoin.svg" alt="buy bitcoin" width="40">
<img src="img/buy-bitcoin.svg" alt="buy bitcoin" width="25">
Buy Bitcoin
<i class="icon ion-ios-arrow-right"></i>
</a>
<a class="item item-avatar"
<a class="item item-icon-right"
ng-show="status.userCanSell"
href ui-sref="glidera.sell">
<img src="img/sell-bitcoin.svg" alt="buy bitcoin" width="40">
<img src="img/sell-bitcoin.svg" alt="buy bitcoin" width="25">
Sell Bitcoin
<i class="icon ion-ios-arrow-right"></i>
</a>
</div>
<div ng-show="permissions.transaction_history">
<h4>Activity</h4>
<div class="card" ng-show="permissions.transaction_history">
<div class="item item-divider">
Activity
</div>
<div ng-show="txs.length == 0 "
class="size-12 p10 text-center text-gray">
class="item">
No activity in your account
</div>
<div class="list">
<a ng-repeat="tx in txs"
ng-click="glidera.openTxModal(token, tx)"
class="item item-avatar">
<img src="img/bought.svg" alt="bought" width="39" ng-show="tx.type == 'BUY' && tx.status == 'COMPLETE'">
<img src="img/bought-pending.svg" alt="bought" width="33" ng-show="tx.type == 'BUY' && tx.status == 'PROCESSING'">
<img src="img/sold.svg" alt="bought" width="39" ng-show="tx.type == 'SELL' && tx.status == 'COMPLETE'">
<img src="img/sold-pending.svg" alt="bought" width="33" ng-show="tx.type == 'SELL' && tx.status == 'PROCESSING'">
<a ng-repeat="tx in txs"
ng-click="glidera.openTxModal(token, tx)"
class="item">
<h2>
<span ng-show="tx.type == 'BUY'">Bought</span>
<span ng-show="tx.type == 'SELL'">Sold</span>
<b>{{tx.qty}}</b> BTC
</h2>
<p>
{{tx.subtotal|currency:'':2}} {{tx.currency}}
</p>
<div class="right">
<div class="m5t size-12 text-gray">
<div ng-show="tx.status == 'COMPLETE'">
<time ng-if="tx.transactionDate">{{tx.transactionDate | amTimeAgo}}</time>
</div>
<div ng-show="tx.status == 'PROCESSING'">
<span class="label outline gray radius text-gray text-info" ng-if="tx.status == 'PROCESSING'">Processing</span>
</div>
</div>
<span class="item-note">
<div ng-show="tx.status == 'COMPLETE'">
<time ng-if="tx.transactionDate">{{tx.transactionDate | amTimeAgo}}</time>
</div>
</a>
</div>
<div ng-show="tx.status == 'PROCESSING'">
<span ng-if="tx.status == 'PROCESSING'">Processing</span>
</div>
</span>
<img class="left m10r" src="img/bought.svg" alt="bought" width="39" ng-show="tx.type == 'BUY' && tx.status == 'COMPLETE'">
<img class="left m10r" src="img/bought-pending.svg" alt="bought" width="33" ng-show="tx.type == 'BUY' && tx.status == 'PROCESSING'">
<img class="left m10r" src="img/sold.svg" alt="bought" width="39" ng-show="tx.type == 'SELL' && tx.status == 'COMPLETE'">
<img class="left m10r" src="img/sold-pending.svg" alt="bought" width="33" ng-show="tx.type == 'SELL' && tx.status == 'PROCESSING'">
<h2>
<span ng-show="tx.type == 'BUY'">Bought</span>
<span ng-show="tx.type == 'SELL'">Sold</span>
<b>{{tx.qty}}</b> BTC
</h2>
<p>
{{tx.subtotal|currency:'':2}} {{tx.currency}}
</p>
</a>
</div>
</div>
</ion-content>

View file

@ -1,22 +1,24 @@
<div
class="topbar-container"
ng-include="'views/includes/topbar.html'"
ng-init="titleSection='Glidera'; closeToHome = true">
</div>
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="tabs.home">
Close
</button>
</ion-nav-buttons>
<ion-nav-title>Glidera</ion-nav-title>
</ion-nav-bar>
<div class="content glidera" ng-controller="glideraUriController as glidera" ng-init="glidera.checkCode()">
<ion-content ng-controller="glideraUriController" ng-init="checkCode()">
<div class="row m20t">
<div class="large-12 columns">
<div class="text-center">
<img src="img/glidera-logo.png"
ng-click="index.updateGlidera()" width="100">
</div>
<div class="box-notification warning" ng-show="network == 'testnet'">
Testnet wallets only work with Glidera Sandbox Accounts
</div>
<div class="m10t text-center" ng-show="glidera.error">
<div class="notification m10b size-12 text-warning">{{glidera.error}}</div>
<button class="outline dark-gray tiny round" ng-click="glidera.submitOauthCode(glidera.code)">Try again</button>
<div class="text-center">
<img src="img/glidera-logo.png" width="100">
<div class="m20t" translate>
Connecting...
</div>
</div>
</div>
</div>
</ion-content>
</ion-view>

View file

@ -1,15 +1,15 @@
<ion-view >
<ion-tabs class="tabs-striped tabs-color-positive tabs-color-active-positive tabs-top">
<ion-tab title="Recovery Phrare" ui-sref="add.import.phrase">
<ion-tab title="Recovery Phrare" ui-sref="tabs.import.phrase">
<ion-nav-view name="tab-import-phrase"></ion-nav-view>
</ion-tab>
<ion-tab title="File/Text" ui-sref="add.import.file">
<ion-tab title="File/Text" ui-sref="tabs.import.file">
<ion-nav-view name="tab-import-file"></ion-nav-view>
</ion-tab>
<ion-tab title="Hardware Wallet" ui-sref="add.import.hardware">
<ion-tab title="Hardware Wallet" ui-sref="tabs.import.hardware">
<ion-nav-view name="tab-import-hardware"></ion-nav-view>
</ion-tab>

View file

@ -1,10 +1,10 @@
<div>
<h1 translate>Without a backup, you could lose money</h1>
<span translate>If something happens to this device, this app is deleted, or your password forgotten, neither you nor Bitpay can revoer your funds.</span>
<button ng-click="goBack()" class="button button-block button-light">
<button ng-click="goBack()" class="button button-block button-light" translate>
Go back
</button>
<button ng-click="continue()" class="button button-block button-light">
<button ng-click="continue()" class="button button-block button-light" translate>
I understand
</button>
</div>

View file

@ -1,7 +1,7 @@
<div>
<h1 translate>Screenshots are not secure</h1>
<span translate>if you take a screenshot, your backup may be viewed by others apps. You can make a safe backup with paper and a pen.</span>
<button ng-click="close()" class="button button-block button-light">
<button ng-click="close()" class="button button-block button-light" translate>
Got it
</button>
</div>

View file

@ -1,41 +1,58 @@
<span class="wallet-activity">
<div ng-if="x.types.indexOf('NewCopayer')>=0 && x.wallet.n>1">
Copayer joined
</div>
<div ng-if="x.types.indexOf('NewCopayer')>=0 && x.wallet.n==1">
Wallet created
</div>
<div ng-if="x.types.indexOf('NewOutgoingTx')>=0">
<span>Payment Sent </span>
<div class="wallet-activity-amount">
{{x.amountStr}}
</div>
</div>
<span ng-if="x.types.indexOf('NewIncomingTx')>=0">
<i class="icon ion-arrow-down-c size-21" ng-style="{'color':x.wallet.color}"></i>
{{x.amountStr}}
<div ng-if="x.types.indexOf('NewIncomingTx')>=0">
<span>Payment Received</span>
<div class="wallet-activity-amount">
{{x.amountStr}}
</div>
</div>
<div ng-if="x.types.indexOf('TxProposalRemoved')>=0">
<i class="icon ion-ios-close-empty size-21" ng-style="{'color':x.wallet.color}"></i>
Proposal Deleted
</div>
<div ng-if="x.types.indexOf('TxProposalRejected')>=0">
<i class="icon ion-ios-close-empty size-21" ng-style="{'color':x.wallet.color}"></i>
Proposal Rejected
</div>
<div ng-if="x.types.indexOf('TxProposalRemoved') == -1 && x.types.indexOf('TxProposalRejected') == -1">
<span ng-if="x.types.indexOf('NewTxProposal')>=0 && x.types.indexOf('NewOutgoingTx')==-1 ">
<i class="icon ion-arrow-up-c size-21" ng-style="{'color':x.wallet.color}"></i>
{{x.amountStr}}
<i>{{x.message}}</i>
</span>
<span ng-if="x.types.indexOf('TxProposalAcceptedBy')>=0 && x.types.indexOf('NewTxProposal') == -1 && x.types.indexOf('NewOutgoingTx')==-1">
<i class="icon ion-checkmark-round size-21" ng-style="{'color':x.wallet.color}"></i>
Proposal Accepted
</span>
</div>
<p class="wallet-activity-note">
<!-- {{x.types}} -->
<i class="icon ion-record wallet-activity-note-child" ng-style="{'color':x.wallet.color}"></i>
<span ng-if="x.creatorName" class="wallet-activity-note-child">{{ x.creatorName}}@</span>
<span class="wallet-activity-note-child">{{x.wallet.name}}</span>
<time class="wallet-activity-note-child">{{ x.createdOn * 1000 | amTimeAgo}}</time>
</p>
</span>
<span ng-if="x.types.indexOf('TxProposalRemoved')>=0">
<i class="icon ion-ios-close-empty size-21" ng-style="{'color':x.wallet.color}"></i>
Proposal Deleted
</span>
<span ng-if="x.types.indexOf('TxProposalRejected')>=0">
<i class="icon ion-ios-close-empty size-21" ng-style="{'color':x.wallet.color}"></i>
Proposal Rejected
</span>
<span ng-if="x.types.indexOf('TxProposalRemoved') == -1 && x.types.indexOf('TxProposalRejected') == -1">
<span ng-if="x.types.indexOf('NewTxProposal')>=0 ">
<i class="icon ion-arrow-up-c size-21" ng-style="{'color':x.wallet.color}"></i>
{{x.amountStr}}
<i>{{x.message}}</i>
</span>
<span ng-if="x.types.indexOf('TxProposalAcceptedBy')>=0 && x.types.indexOf('NewTxProposal') == -1 ">
<i class="icon ion-checkmark-round size-21" ng-style="{'color':x.wallet.color}"></i>
Proposal Accepted
</span>
</span>
<div class="item-note">
<!-- {{x.types}} -->
<time>{{ x.createdOn * 1000 | amTimeAgo}}</time>
&middot;
<i class="ion-briefcase" ng-style="{'color':x.wallet.color}"></i>
<span ng-if="x.creatorName">{{ x.creatorName}}@</span>{{x.wallet.name}}
</div>

View file

@ -1,7 +1,7 @@
<div class="wallets" ng-show="wallets[0]">
<ion-slides class="slides" slider="data.slider">
<ion-slide-page ng-repeat="wallet in wallets track by $index">
<div class="item item-icon-left">
<div class="item item-icon-left item-icon-right">
<i class="icon ion-briefcase size-21" ng-style="{'color':wallet.color}"></i>
{{wallet.name || wallet.id}}
<span class="item-note" ng-show="wallet.n > 1 && wallet.isComplete()">
@ -10,6 +10,7 @@
<span class="badge badge-assertive" ng-show="!wallet.isComplete()" translate>
Incomplete
</span>
<i ng-show="wallet.needsBackup" class="icon ion-android-warning assertive"></i>
</div>
</ion-slide-page>
</ion-slides>

View file

@ -1,7 +1,7 @@
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="add.main">
<button class="button no-border" ui-sref="tabs.add">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>
@ -133,4 +133,3 @@
</form>
</ion-content>
</ion-view>

View file

@ -1,5 +1,5 @@
<ion-modal-view ng-controller="glideraTxDetailsController">
<ion-header-bar align-title="center" class="tab-bar">
<ion-header-bar align-title="center" class="bar-stable">
<button class="button button-clear button-positive"
ng-click="cancel()">
Close
@ -8,8 +8,7 @@
</ion-header-bar>
<ion-content>
<div class="modal-content fix-modals-touch">
<div class="header-modal bg-gray text-center">
<div class="text-center">
<div class="p20">
<img src="img/bought.svg" alt="bought" width="80" ng-show="tx.type == 'BUY' && tx.status == 'COMPLETE'">
<img src="img/bought-pending.svg" alt="bought" width="65" ng-show="tx.type == 'BUY' && tx.status == 'PROCESSING'">
@ -19,46 +18,46 @@
<span ng-show="tx.type == 'BUY'">Bought</span>
<span ng-show="tx.type == 'SELL'">Sold</span>
<b>{{tx.qty}}</b> BTC
<div class="size-36 m20b">
<div class="size-36 m20v">
{{tx.subtotal|currency:'':2}} {{tx.currency}}
</div>
</div>
<ul class="no-bullet size-14">
<ul class="list">
<li class="line-b p10 oh">
<span class="text-gray">Status</span>
<span class="text-success right" ng-if="tx.status == 'COMPLETE'">Completed</span>
<span class="text-info right" ng-if="tx.status == 'PROCESSING'">Processing</span>
<span class="text-warning right" ng-if="tx.status == 'ERROR'">Error</span>
<li class="item">
Status
<span class="item-note">
<span class="text-success" ng-if="tx.status == 'COMPLETE'">Completed</span>
<span class="text-info" ng-if="tx.status == 'PROCESSING'">Processing</span>
<span class="text-warning" ng-if="tx.status == 'ERROR'">Error</span>
</span>
</li>
<li ng-show="tx.transactionDate" class="line-b p10 oh">
<span class="text-gray">Date</span>
<span class="right">{{tx.transactionDate | amCalendar}}</span>
<li ng-show="tx.transactionDate" class="item">
Date
<span class="item-note">{{tx.transactionDate | amCalendar}}</span>
</li>
<li ng-show="tx.price" class="line-b p10 oh">
<span class="text-gray">Exchange rate</span>
<span class="right">{{tx.price|currency:'':2}} {{tx.currency}}/BTC</span>
<li ng-show="tx.price" class="item">
Exchange rate
<span class="item-note">{{tx.price|currency:'':2}} {{tx.currency}}/BTC</span>
</li>
<li ng-show="tx.subtotal" class="line-b p10 oh">
<span class="text-gray">Subtotal</span>
<span class="right">{{tx.subtotal|currency:'':2}} {{tx.currency}}</span>
<li ng-show="tx.subtotal" class="item">
Subtotal
<span class="item-note">{{tx.subtotal|currency:'':2}} {{tx.currency}}</span>
</li>
<li ng-show="tx.fees" class="line-b p10 oh">
<span class="text-gray">Fees</span>
<span class="right">{{tx.fees|currency:'':2}} {{tx.currency}}</span>
<li ng-show="tx.fees" class="item">
Fees
<span class="item-note">{{tx.fees|currency:'':2}} {{tx.currency}}</span>
</li>
<li ng-show="tx.total" class="line-b p10 oh text-bold">
<span class="text-gray">Total</span>
<span class="right">{{tx.total|currency:'':2}} {{tx.currency}}</span>
<li ng-show="tx.total" class="item">
Total
<span class="item-note">{{tx.total|currency:'':2}} {{tx.currency}}</span>
</li>
</ul>
<div class="extra-margin-bottom"></div>
</div>
</ion-content>
</ion-modal-view>

View file

@ -2,7 +2,7 @@
<ion-nav-bar class="bar-stable">
<ion-nav-buttons side="primary">
<button class="button no-border" href ui-sref="onboarding.backupRequest">
<i class="icon ion-chevron-left"></i> Back
<i class="icon ion-chevron-left"></i> {{'Back' | translate}}
</button>
</ion-nav-buttons>
</ion-nav-bar>

View file

@ -1,14 +1,14 @@
<ion-view ng-controller="collectEmailController">
<ion-nav-bar class="bar-stable">
<ion-view>
<ion-nav-bar class="bar-stable" ng-controller="backController">
<ion-nav-buttons side="secondary">
<button class="button no-border" ng-click="skip()">
Skip
<button class="button no-border" ng-click="onboardingMailSkip()">
{{'Skip' | translate}}
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-content >
Wallet Created
Where would you like to receive email notifications about payments
<ion-content ng-controller="collectEmailController">
<span translate>Wallet Created </span>
<span translate>Where would you like to receive email notifications about payments </span>
<form name="emailForm" ng-submit="save(emailForm)" novalidate>
<input type="email" id="email" name="email" ng-model="email" required></input>
<input type="submit" class="button button-block button-positive" value="{{'Save'|translate}}" ng-disabled="emailForm.$invalid">

View file

@ -1,6 +1,6 @@
<ion-view id="terms-of-use">
<ion-nav-bar class="bar-light">
<ion-nav-title>Terms of Use</ion-nav-title>
<ion-nav-bar class="bar-ligt">
<ion-nav-title>{{'Terms of Use' | translate}}</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button no-border" href ui-sref="onboarding.disclaimer">
<i class="icon ion-arrow-left-c"></i>

View file

@ -1,5 +1,5 @@
<ion-view ng-controller="tourController" ng-init="init()" class="onboarding" id="onboard-tour">
<ion-nav-bar>
<ion-nav-bar class="bar-stable">
<ion-nav-title></ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button no-border" ng-click="goBack()">
@ -7,8 +7,8 @@
</button>
</ion-nav-buttons>
<ion-nav-buttons side="secondary">
<button class="button no-border" ng-show="data.index == 0" ng-click="createProfile()">
Skip
<button class="button no-border" ng-show="data.index == 0" ng-click="createDefaultWallet()">
{{'Skip' | translate}}
</button>
</ion-nav-buttons>
</ion-nav-bar>

View file

@ -1,5 +1,5 @@
<ion-view id="onboard-welcome" class="onboarding">
<ion-content>
<ion-content ng-controller="welcomeController" ng-init="createProfile()">
<img src="../img/onboarding-welcome-shopping24.png" id="shopping-24" />
<div class="text-center">
<div class="row">
@ -16,6 +16,5 @@
<div class="row">
<button class="button button-block restore col col-75" translate>Restore</button>
</div>
</div>
</ion-content>
</ion-view>

View file

@ -9,7 +9,7 @@
<div class="item item-divider">
Preferences
</div>
<div class="item item-icon-right" href ui-sref="wallet.preferencesAlias">
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesAlias">
<span translate>Wallet Name</span>
<span class="item-note">
{{alias||wallet.walletName}}
@ -28,7 +28,7 @@
{{wallet.externalSource}}
</span>
</div>
<div class="item item-icon-right" href ui-sref="wallet.preferencesColor">
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesColor">
<span ng-style="{'color': wallet.color}">&block;</span>
<span translate>Wallet Color</span>
<span class="item-note">
@ -36,7 +36,7 @@
</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
<div class="item item-icon-right" href ui-sref="wallet.preferencesEmail">
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesEmail">
<span translate>Email Notifications</span>
<span class="item-note">
<span ng-if="!wallet.email" translate>Disabled</span>
@ -47,7 +47,7 @@
<div class="item item-divider">
Security
</div>
<div class="item item-icon-right" href ui-sref="wallet.backup" ng-hide="wallet.isPrivKeyExternal()">
<div class="item item-icon-right" href ui-sref="tabs.preferences.backup" ng-hide="wallet.isPrivKeyExternal()">
<span translate>Backup</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
@ -61,14 +61,14 @@
<span class="toggle-label" translate>Request Fingerprint</span>
</ion-toggle>
</div>
<div class="item item-icon-right" href ui-sref="wallet.deleteWords" ng-show ="!deleted">
<div class="item item-icon-right" href ui-sref="tabs.preferences.deleteWords" ng-show ="!deleted">
<span translate>Delete recovery phrase</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
<div class="item item-divider">
Advanced
</div>
<div class="item item-icon-right" href ui-sref="wallet.preferencesAdvanced">
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesAdvanced">
<span translate>Advanced</span>
<i class="icon ion-ios-arrow-right"></i>
</div>

View file

@ -26,15 +26,15 @@
</div>
<div class="item item-divider">
</div>
<div class="item item-icon-left" href ui-sref="settings.termsOfUse">
<div class="item item-icon-left" href ui-sref="tabs.termsOfUse">
<i class="icon ion-ios-bell-outline"></i>
<span translate>Terms of Use</span>
</div>
<div class="item item-icon-left" href ui-sref="settings.translators">
<div class="item item-icon-left" href ui-sref="tabs.translators">
<i class="icon ion-ios-bell-outline"></i>
<span translate>Translators</span>
</div>
<div class="item item-icon-left" href ui-sref="settings.logs">
<div class="item item-icon-left" href ui-sref="tabs.logs">
<i class="icon ion-ios-bell-outline"></i>
<span translate>Session log</span>
</div>

View file

@ -9,27 +9,27 @@
<div class="list">
<div class="item item-divider">
</div>
<div class="item item-icon-right" href ui-sref="wallet.information">
<div class="item item-icon-right" href ui-sref="tabs.preferences.information">
<span translate>Wallet Information</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
<div class="item item-icon-right" ng-show="index.network == 'livenet'" href ui-sref="wallet.paperWallet">
<div class="item item-icon-right" ng-show="index.network == 'livenet'" href ui-sref="tabs.preferences.paperWallet">
<span translate>Sweep paper wallet</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
<div class="item item-icon-right" href ui-sref="wallet.export.file">
<div class="item item-icon-right" href ui-sref="tabs.preferences.export.file">
<span translate>Export Wallet</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
<div class="item item-icon-right" href ui-sref="wallet.preferencesBwsUrl">
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesBwsUrl">
<span translate>Wallet Service URL</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
<div class="item item-icon-right" href ui-sref="wallet.preferencesHistory">
<div class="item item-icon-right" href ui-sref="tabs.preferences.preferencesHistory">
<span translate>Transaction History</span>
<i class="icon ion-ios-arrow-right"></i>
</div>
<div class="item item-icon-right" href ui-sref="wallet.delete">
<div class="item item-icon-right" href ui-sref="tabs.preferences.delete">
<span translate>Delete Wallet</span>
<i class="icon ion-ios-arrow-right"></i>
</div>

View file

@ -10,7 +10,11 @@
<ion-content ng-controller="sellGlideraController as sell" ng-init="init()">
<h4 class="padding" ng-show="limits && !sell.show2faCodeInput && !sell.success">
<div class="box-notification warning" ng-show="network == 'testnet'">
Testnet wallets only work with Glidera Sandbox Accounts
</div>
<div class="box-notification notice" ng-show="limits && !sell.show2faCodeInput && !sell.success">
<span class="text-light">Daily sell limit</span>:
{{limits.dailySell|currency:'':2}} {{limits.currency}}
(remaining {{limits.dailySellRemaining|currency:'':2}} {{limits.currency}})
@ -18,7 +22,7 @@
<span class="text-light">Monthly sell limit</span>:
{{limits.monthlySell|currency:'':2}} {{limits.currency}}
(remaining {{limits.monthlySellRemaining|currency:'':2}} {{limits.currency}})
</h4>
</div>
<div class="box-notification m20b" ng-show="limits.transactDisabledPendingFirstTransaction">
<span class="text-warning">
@ -31,19 +35,6 @@
ng-submit="sell.get2faCode(token)" novalidate>
<div class="list">
<label class="item item-input item-stacked-label">
<span class="input-label">Wallet</span>
<input type="text"
id="address"
name="address"
ng-disabled="sell.selectedWalletId"
ng-attr-placeholder="{{'Choose your source wallet'}}"
ng-model="sell.selectedWalletName" required>
<a on-tap="openWalletsModal(sell.allWallets)">
<i class="icon ion-briefcase size-18"></i>
</a>
</label>
<label class="item item-input item-stacked-label">
<span class="input-label"><span>Amount in</span> {{showAlternative ? 'USD' : 'BTC'}}</span>
<input ng-show="!showAlternative"
@ -73,6 +64,8 @@
class="postfix"
on-tap="showAlternative = false; fiat = null; sell.sellPrice = null">USD</a>
</label>
<wallets ng-if="wallets[0]" wallets="wallets"></wallets>
</div>
<div class="text-center text-gray size-12 m20b" ng-show="!sell.gettingSellPrice && sell.sellPrice.qty">
@ -92,7 +85,7 @@
<button class="button button-block"
type="submit"
ng-disabled="limits.transactDisabledPendingFirstTransaction || !sell.sellPrice.qty || !sell.selectedWalletId ">
ng-disabled="limits.transactDisabledPendingFirstTransaction || !sell.sellPrice.qty">
Continue
</button>
</form>
@ -122,11 +115,6 @@
</p>
</div>
</div>
<div class="box-notification" ng-show="sell.error && !sell.success">
<span class="text-warning size-14">
{{sell.error}}
</span>
</div>
<div class="text-center" ng-show="sell.success">
<h1>Sale initiated</h1>
<p class="text-gray">

View file

@ -1,7 +1,7 @@
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="add.main">
<button class="button no-border" ui-sref="tabs.add">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>
@ -28,7 +28,7 @@
ng-blur="create.formFocus(false)">
</label>
<ion-toggle ng-model="showAdv" toggle-class="toggle-stable">
<ion-toggle ng-model="showAdv" toggle-class="toggle-stable" ng-change="showAdvChange()">
<span translate ng-show="!showAdv">Show advanced options</span>
<span translate ng-show="showAdv">Hide advanced options</span>
</ion-toggle>

View file

@ -1,6 +1,6 @@
<ion-nav-bar class="bar-stable">
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="add.main">
<button class="button no-border" ui-sref="tabs.add">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>
@ -61,7 +61,7 @@
</select>
</label>
<ion-toggle ng-model="showAdv" toggle-class="toggle-stable">
<ion-toggle ng-model="showAdv" toggle-class="toggle-stable" ng-change="showAdvChange()">
<span translate ng-show="!showAdv">Show advanced options</span>
<span translate ng-show="showAdv">Hide advanced options</span>
</ion-toggle>

View file

@ -1,7 +1,7 @@
<ion-nav-bar class="bar-stable">
<ion-nav-title>Export Wallet</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="wallet.preferencesAdvanced">
<button class="button no-border" ui-sref="tabs.preferences.preferencesAdvanced">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>

View file

@ -1,7 +1,7 @@
<ion-nav-bar class="bar-stable">
<ion-nav-title>Export Wallet</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="wallet.preferencesAdvanced">
<button class="button no-border" ui-sref="tabs.preferences.preferencesAdvanced">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>

View file

@ -1,5 +1,4 @@
<ion-view>
<ion-view id="tab-home">
<ion-nav-bar class="bar-stable">
<ion-nav-title>Home</ion-nav-title>
</ion-nav-bar>
@ -7,85 +6,106 @@
<ion-content class="padding" ng-controller="tabHomeController" ng-init="updateAllWallets(); nextStep()">
<div class="card">
<div class="item item-divider">
<div class="item item-divider item-icon-right">
Recent Activity
<i class="icon ion-ios-arrow-right" ui-sref="activity"></i>
</div>
<div ng-if="fetchingNotifications" class="item text-center">
<ion-spinner icon="lines"></ion-spinner>
<div translate>Updating activity. Please stand by</div>
</div>
<div ng-if="!fetchingNotifications">
<a class="item item-icon-left" ng-repeat="x in notifications" ng-click="x.action()">
<a class="item" ng-repeat="x in notifications" ng-click="x.action()">
<span ng-include="'views/includes/walletActivity.html'"></span>
</a>
<a class="item text-center" ui-sref="activity" ng-show="notificationsMore">
<span translate>More</span> ({{notificationsMore}})
<span style="font-size:12px;color:gray">(ToDo: Cache, refresh & seft not. 1-1 no here yet)</span>
</a>
<div class="item" ng-show="!notifications[0]">
<span translate>Nothing to show here.</span>
</div>
</div>
</div>
<div class="card">
<div class="item item-divider item-icon-right">
<div class="list card" ng-hide="!wallets[0]">
<div class="item item-icon-right item-heading">
Wallets
<i class="icon ion-ios-plus-empty" ui-sref="add.main"></i>
<a ui-sref="tabs.add"><i class="icon ion-ios-plus-empty list-add-button"></i></a>
</div>
<div class="item" ng-if="!wallets[0]">
<span translate>No Wallet</span>
</div>
<a ng-repeat="item in wallets track by $index"
class="item item-icon-left"
ui-sref="wallet.details({'walletId': item.id})">
<i class="icon ion-briefcase size-21" ng-style="{'color':item.color}"></i>
{{item.name || item.id}}
<span ng-show="item.n > 1" class="text-light">
{{item.m}}-of-{{item.n}}
<a ng-repeat="wallet in wallets track by $index"
class="item item-icon-left item-big-icon-left item-icon-right"
ui-sref="tabs.details({'walletId': wallet.id})">
<i class="icon big-icon-svg">
<img src="img/icon-wallet.svg" ng-style="{'background-color': wallet.color}"/>
</i>
<h2>{{wallet.name || wallet.id}}</h2>
<span ng-show="wallet.n > 1" class="text-light">
{{wallet.m}}-of-{{wallet.n}}
</span>
<span class="badge badge-assertive" ng-show="!item.isComplete()" translate>
<span class="badge badge-assertive" ng-show="!wallet.isComplete()" translate>
Incomplete
</span>
<span class="item-note" ng-show="item.isComplete()">
{{item.status.availableBalanceStr}}
</span>
<p ng-show="wallet.isComplete() && !wallet.balanceHidden">
{{wallet.status.availableBalanceStr}}
</p>
<p ng-show="wallet.isComplete() && wallet.balanceHidden">
<strong class="size-12" translate>[Balance Hidden]</strong>
</p>
<i class="icon ion-ios-arrow-right nav-item-arrow-right"></i>
</a>
<a ui-sref="bitpayCard.main" ng-show="externalServices.BitpayCard" class="item item-icon-left">
<i class="icon ion-card"></i>BitPay Card
<i class="icon ion-card"></i>
<h2>BitPay Card</h2>
</a>
<a ui-sref="amazon.main" ng-show="externalServices.AmazonGiftCards" class="item item-icon-left">
<i class="icon ion-ios-cart"></i>Gift Cards
<i class="icon ion-ios-cart"></i>
<h2>Gift Cards</h2>
</a>
</div>
<div class="card" ng-show="externalServices.BuyAndSell && (glideraEnabled || coinbaseEnabled)">
<div class="item item-divider">
<div class="list card" ng-show="externalServices.BuyAndSell && (glideraEnabled || coinbaseEnabled)">
<div class="item item-heading">
Buy & Sell Bitcoin
</div>
<a ng-show="glideraEnabled" ui-sref="glidera.main" class="item">
<img src="img/glidera-logo.png" width="90">
<a ng-show="glideraEnabled" ui-sref="glidera.main" class="item item-icon-right">
<img src="img/glidera-logo.png" width="90"/>
<i class="icon ion-ios-arrow-right nav-item-arrow-right"></i>
</a>
<a ng-show="coinbaseEnabled" ui-sref="exchange.coinbase" class="item">
<!-- disable coinbase for this release -->
<!-- <a ng-show="coinbaseEnabled" ui-sref="exchange.coinbase" class="item">
<img src="img/coinbase-logo.png" width="90"> TODO
</a>
</a> -->
</div>
<div class="card" ng-show="!externalServices.AmazonGiftCards || !externalServices.BitpayCard || !externalServices.BuyAndSell">
<div class="item item-divider">
<div class="list card"
ng-show="!externalServices.AmazonGiftCards || !externalServices.BitpayCard || !externalServices.BuyAndSell || !wallets[1]">
<div class="item item-heading">
Next steps
</div>
<a ui-sref="bitpayCard.main" ng-show="!externalServices.BitpayCard" class="item item-icon-left">
<i class="icon ion-card"></i>Add BitPay Card
<a ng-show="!wallets[1]" ui-sref="tabs.add" class="item item-icon-left item-big-icon-left item-icon-right">
<i class="icon big-icon-svg">
<img class="icon-create-wallet"/>
</i>
<span>Create a bitcoin wallet</span>
<i class="icon ion-ios-arrow-right nav-item-arrow-right"></i>
</a>
<a ng-show="!externalServices.BuyAndSell" ui-sref="buyandsell" class="item item-icon-left">
<i class="icon ion-bag"></i>Buy and Sell Bitcoin
<a ng-show="!externalServices.BuyAndSell" ui-sref="buyandsell" class="item item-icon-left item-big-icon-left item-icon-right">
<i class="icon big-icon-svg">
<img class="icon-buy-bitcoin"/>
</i>
<span>Buy Bitcoin</span>
<i class="icon ion-ios-arrow-right nav-item-arrow-right"></i>
</a>
<a ui-sref="amazon.main" ng-show="!externalServices.AmazonGiftCards" class="item item-icon-left">
<i class="icon ion-ios-cart"></i>Buy a Gift Cards
<a ui-sref="bitpayCard.main" ng-show="!externalServices.BitpayCard" class="item item-icon-left item-big-icon-left item-icon-right">
<i class="icon big-icon-svg">
<img class="icon-bitpay-card"/>
</i>
<span>Add BitPay Card</span>
<i class="icon ion-ios-arrow-right nav-item-arrow-right"></i>
</a>
<a ui-sref="amazon.main" ng-show="!externalServices.AmazonGiftCards" class="item item-icon-left item-big-icon-left item-icon-right">
<i class="icon big-icon-svg">
<img class="icon-gift"/>
</i>
<span>Add Amazon Gift Card</span>
<i class="icon ion-ios-arrow-right nav-item-arrow-right"></i>
</a>
</div>

View file

@ -1,6 +1,6 @@
<ion-nav-bar class="bar-stable">
<ion-nav-bar class="bar-stable" ng-controller="backController">
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="add.main">
<button class="button no-border" ng-click="importGoBack()">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>

View file

@ -1,6 +1,6 @@
<ion-nav-bar class="bar-stable">
<ion-nav-bar class="bar-stable" ng-controller="backController">
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="add.main">
<button class="button no-border" ng-click="importGoBack()">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>

View file

@ -1,6 +1,6 @@
<ion-nav-bar class="bar-stable">
<ion-nav-bar class="bar-stable" ng-controller="backController">
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="add.main">
<button class="button no-border" ng-click="importGoBack()">
<i class="icon ion-chevron-left"></i> Back
</button>
</ion-nav-buttons>

View file

@ -1,42 +1,37 @@
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-title>Receive</ion-nav-title>
<ion-nav-bar>
<ion-nav-title>{{'Receive' | translate}}</ion-nav-title>
</ion-nav-bar>
<ion-content ng-controller="tabReceiveController" ng-init="init()">
<div class="text-center m30v" copy-to-clipboard="addr" ng-show="addr">
<qrcode size="220" data="bitcoin:{{addr}}" ng-show="addr"></qrcode>
<div class="m30v text-center" copy-to-clipboard="addr">
<qrcode size="220" data="bitcoin:{{addr}}"></qrcode>
<div ng-if="wallet.needsBackup" class="assertive" translate>
Before receiving funds, you must backup your wallet. If this device is lost, it is impossible to access your funds without a backup.
</div>
</div>
<div class="padding assertive" ng-show="error">
{{error|translate}}
</div>
<div ng-show="generatingAddress" class="m30v">
<div style="height:220px; width:220px; margin:auto; background: #eee; text-align:center">
<div class="padding-top">
<ion-spinner class="spinner-dark" icon="lines"></ion-spinner>
</div>
</div>
</div>
<div class="list card padding text-center" ng-if="!wallets[0]">
<span translate>No Wallet</span>
</div>
<div class="list" ng-if="wallets[0]">
<div class="item item-icon-left" ng-click="shareAddress(addr)" ng-show="isCordova && addr" ng-disabled="generatingAddress">
<div class="item item-icon-left" ng-click="shareAddress(addr)" ng-show="isCordova && addr">
<i class="icon ion-ios-upload-outline"></i>
<span translate>Share address</span>
</div>
<div class="item item-icon-left" ng-click="setAddress(null, true)" ng-disabled="">
<div class="item item-icon-left" ng-click="setAddress(null, true)">
<i class="icon ion-ios-loop"></i>
<span translate>Next Address</span>
</div>
<div class="item item-icon-left">
<i class="icon ion-social-bitcoin-outline"></i>
<span ng-show="generatingAddress">...</span>
<span ng-show="!generatingAddress" copy-to-clipboard="addr">{{addr}}</span>
<span ng-if="generatingAddress">...</span>
<span ng-if="!generatingAddress" copy-to-clipboard="addr">{{addr}}</span>
</div>
<wallets ng-if="wallets[0]" wallets="wallets"></wallets>

View file

@ -1,16 +1,12 @@
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-title>Send</ion-nav-title>
<ion-nav-bar>
<ion-nav-title>{{'Send' | translate}}</ion-nav-title>
</ion-nav-bar>
<ion-content ng-controller="tabSendController" ng-init="init()">
<div class="card">
<div class="item item-divider">
Recipient
</div>
<div class="item item-divider" translate>Recipient</div>
<div class="list list-inset">
<label class="item item-input">
<i class="icon ion-search placeholder-icon"></i>
@ -25,7 +21,7 @@
<div class="card" ng-if="list[0]">
<div class="item item-divider item-icon-right">
Contacts & Wallets
<span translate>Contacts & Wallets</span>
<i class="icon ion-person-add" ng-click="openAddressbookModal()"></i>
</div>
<div class="item text-center" ng-show="!list[0]" translate>No Wallet - Contact</div>

View file

@ -14,7 +14,7 @@
<div class="item item-divider">Preferences</div>
<div class="item item-icon-left" href ui-sref="settings.language">
<div class="item item-icon-left" href ui-sref="tabs.language">
<i class="icon ion-ios-chatbubble-outline"></i>
<span translate>Language</span>
<span class="item-note">
@ -22,7 +22,7 @@
</span>
</div>
<div class="item item-icon-left" href ui-sref="settings.unit">
<div class="item item-icon-left" href ui-sref="tabs.unit">
<i class="icon ion-ios-calculator-outline"></i>
<span translate>Unit</span>
<span class="item-note">
@ -30,7 +30,7 @@
</span>
</div>
<div class="item item-icon-left" href ui-sref="settings.altCurrency">
<div class="item item-icon-left" href ui-sref="tabs.altCurrency">
<i class="icon ion-social-usd-outline"></i>
<span translate>Alternative Currency</span>
<span class="item-note">
@ -38,7 +38,7 @@
</span>
</div>
<div class="item item-icon-left" href ui-sref="settings.fee">
<div class="item item-icon-left" href ui-sref="tabs.fee">
<i class="icon ion-ios-film-outline"></i>
<span translate>Bitcoin Network Fee Policy</span>
<span class="item-note">
@ -77,9 +77,26 @@
<span class="toggle-label" translate>Use Unconfirmed Funds</span>
</ion-toggle>
<div class="item item-icon-left" href ui-sref="settings.about">
<div class="list">
<div class="item item-divider">Wallets Settings</div>
<div ng-repeat="item in wallets track by $index">
<div class="item item-icon-left" href ui-sref="tabs.preferences.main({'walletId': item.id})">
<i class="icon ion-briefcase size-21" ng-style="{'color':item.color}"></i>
{{item.name || item.id}}
<span ng-show="item.n > 1" class="text-light">
{{item.m}}-of-{{item.n}}
</span>
<span class="badge badge-assertive" ng-show="!item.isComplete()" translate>
Incomplete
</span>
</div>
</div>
</div>
<div class="item item-divider"></div>
<div class="item item-icon-left" href ui-sref="tabs.about">
<i class="icon ion-ios-film-outline"></i>
<span translate>About Copay</span>
<span translate>About Bitpay Wallet</span>
</div>
</div>
</ion-content>

View file

@ -3,14 +3,9 @@
<ion-view>
<ion-nav-bar class="bar-stable">
<ion-nav-title>{{wallet.name}}</ion-nav-title>
<ion-nav-buttons side="primary">
<button class="button no-border" ui-sref="tabs.home">
Close
</button>
</ion-nav-buttons>
<ion-nav-buttons side="secondary">
<button class="button button-icon icon ion-ios-settings" ui-sref="wallet.preferences"></button>
</ion-nav-buttons>
<ion-nav-back-button>
{{'Back' | translate}}
</ion-nav-back-button>
</ion-nav-bar>
<ion-content ng-controller="walletDetailsController" ng-init="init()" delegate-handle="my-handle">
@ -44,7 +39,7 @@
</div>
<div ng-click='updateAll()' ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && !shouldHideBalance" on-hold="hideToggle()">
<div ng-click='updateAll()' ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && !wallet.balanceHidden" on-hold="hideToggle()">
<strong class="size-36">{{status.totalBalanceStr}}</strong>
<div class="size-14" ng-if="status.totalBalanceAlternative">{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}</div>
<div class="size-14" ng-if="status.pendingAmount">
@ -52,7 +47,7 @@
</div>
</div>
<div ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && shouldHideBalance" on-hold="hideToggle()">
<div ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && wallet.balanceHidden" on-hold="hideToggle()">
<strong class="size-24" translate>[Balance Hidden]</strong>
<div class="size-14" translate>
Tap and hold to show

30
src/css/links.css Normal file
View file

@ -0,0 +1,30 @@
@font-face {
font-family: 'roboto-regular';
font-style: normal;
font-weight: 400;
src: local('Roboto Regular'),
local('Roboto-Regular'),
url(../roboto-font/Roboto-Regular.ttf) format('truetype'),
url(../roboto-font/Roboto-Regular.woff) format('woff'),
url(../roboto-font/Roboto-Regular.woff2) format('woff2');
}
@font-face {
font-family: 'roboto-bold';
font-style: normal;
font-weight: 700;
src: local('Roboto Bold'),
local('Roboto-Bold'),
url(../roboto-font/Roboto-Bold.ttf) format('truetype'),
url(../roboto-font/Roboto-Bold.woff) format('woff'),
url(../roboto-font/Roboto-Bold.woff2) format('woff2');
}
@font-face {
font-family: 'roboto-italic';
font-style: italic;
font-weight: 400;
src: local('Roboto Italic'),
local('Roboto-Italic'),
url(../roboto-font/Roboto-Italic.ttf) format('truetype'),
url(../roboto-font/Roboto-Italic.woff) format('woff'),
url(../roboto-font/Roboto-Italic.woff2) format('woff2');
}

View file

@ -4,43 +4,19 @@ angular.module('copayApp.controllers').controller('activityController',
function($rootScope, $timeout, $scope, $state, lodash, profileService, walletService, configService, txFormatService, $ionicModal, $log, platformInfo) {
var self = this;
var setNotifications = function(notifications) {
var n = walletService.processNotifications(notifications);
$scope.notifications = n;
$timeout(function() {
$scope.$apply();
}, 1);
};
$scope.init = function() {
$scope.wallets = profileService.getWallets();
var i = $scope.wallets.length,
j = 0;
var timeSpan = 60 * 60 * 24 * 7;
var notifications = [];
$scope.fetchingNotifications = true;
lodash.each($scope.wallets, function(wallet) {
walletService.getNotifications(wallet, {
timeSpan: timeSpan
}, function(err, n) {
if (err) {
console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO
return;
}
notifications.push(n);
if (++j == i) {
$scope.fetchingNotifications = false;
setNotifications(lodash.compact(lodash.flatten(notifications)));
};
});
profileService.getNotifications(50, function(err, n) {
if (err) {
console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO
return;
}
$scope.fetchingNotifications = false;
$scope.notifications = n;
$timeout(function() {
$scope.$apply();
}, 1);
});
}
});

View file

@ -1,11 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('amazonController',
function($scope, $timeout, $ionicModal, $log, lodash, bwcError, amazonService, platformInfo, nodeWebkit) {
if (platformInfo.isCordova && StatusBar.isVisible) {
StatusBar.backgroundColorByHexString("#4B6178");
}
function($scope, $timeout, $ionicModal, $log, lodash, bwcError, amazonService, platformInfo, nodeWebkit, popupService) {
$scope.openExternalLink = function(url, target) {
if (platformInfo.isNW) {
@ -21,7 +17,7 @@ angular.module('copayApp.controllers').controller('amazonController',
$scope.network = amazonService.getEnvironment();
amazonService.getPendingGiftCards(function(err, gcds) {
if (err) {
self.error = err;
popupService.showAlert(err);
return;
}
$scope.giftCards = lodash.isEmpty(gcds) ? null : gcds;
@ -41,7 +37,7 @@ angular.module('copayApp.controllers').controller('amazonController',
$log.debug("creating gift card");
amazonService.createGiftCard(dataFromStorage, function(err, giftCard) {
if (err) {
$log.debug(bwcError.msg(err));
popupService.showAlert(bwcError.msg(err));
return;
}
if (giftCard.status != 'PENDING') {
@ -61,7 +57,7 @@ angular.module('copayApp.controllers').controller('amazonController',
$log.debug("Saving new gift card");
amazonService.getPendingGiftCards(function(err, gcds) {
if (err) {
self.error = err;
popupService.showAlert(err);
return;
}
$scope.giftCards = gcds;

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('amountController', function($rootScope, $scope, $filter, $timeout, $ionicScrollDelegate, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService) {
angular.module('copayApp.controllers').controller('amountController', function($rootScope, $scope, $filter, $timeout, $ionicHistory, $ionicScrollDelegate, $ionicNavBarDelegate, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService) {
$ionicNavBarDelegate.title(gettextCatalog.getString('Enter Amount'));
var unitToSatoshi;
var satToUnit;
@ -63,7 +63,7 @@ angular.module('copayApp.controllers').controller('amountController', function($
// in SAT ALWAYS
if ($stateParams.toAmount) {
$scope.amount = (($stateParams.toAmount) * satToUnit).toFixed(unitDecimals) ;
$scope.amount = (($stateParams.toAmount) * satToUnit).toFixed(unitDecimals);
}
@ -188,13 +188,9 @@ angular.module('copayApp.controllers').controller('amountController', function($
var amount = $scope.showAlternativeAmount ? fromFiat(_amount).toFixed(unitDecimals) : _amount.toFixed(unitDecimals);
$state.transitionTo('send.confirm', {
toAmount:amount * unitToSatoshi,
toAmount: amount * unitToSatoshi,
toAddress: $scope.toAddress,
toName: $scope.toName,
});
};
$scope.cancel = function() {
$state.transitionTo('tabs.send');
};
});

View file

@ -0,0 +1,19 @@
'use strict';
angular.module('copayApp.controllers').controller('backController', function($scope, $state, $stateParams, platformInfo) {
var isCordova = platformInfo.isCordova;
var isWP = platformInfo.isWP;
var usePushNotifications = isCordova && !isWP;
$scope.importGoBack = function() {
if ($stateParams.fromOnboarding) $state.go('onboarding.welcome');
else $state.go('tabs.add');
};
$scope.onboardingMailSkip = function() {
if (!usePushNotifications) $state.go('onboarding.backupRequest');
else $state.go('onboarding.notifications');
}
});

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('backupController',
function($rootScope, $scope, $timeout, $log, $state, $stateParams, $ionicPopup, $ionicNavBarDelegate, uxLanguage, lodash, fingerprintService, platformInfo, configService, profileService, bwcService, walletService, ongoingProcess) {
function($rootScope, $scope, $timeout, $log, $state, $stateParams, $ionicPopup, $ionicNavBarDelegate, uxLanguage, lodash, fingerprintService, platformInfo, configService, profileService, bwcService, walletService, ongoingProcess, storageService) {
var wallet = profileService.getWallet($stateParams.walletId);
$ionicNavBarDelegate.title(wallet.credentials.walletName);
$scope.n = wallet.n;
@ -136,7 +136,7 @@ angular.module('copayApp.controllers').controller('backupController',
}
}
$rootScope.$emit('Local/BackupDone');
profileService.setBackupFlag(walletClient.credentials.walletId);
return cb();
}, 1);
};

View file

@ -1,14 +1,10 @@
'use strict';
angular.module('copayApp.controllers').controller('bitpayCardController', function($scope, $rootScope, $timeout, $log, $ionicModal, lodash, bitpayCardService, configService, profileService, walletService, ongoingProcess, pbkdf2Service, moment, platformInfo) {
angular.module('copayApp.controllers').controller('bitpayCardController', function($scope, $timeout, $log, lodash, bitpayCardService, configService, profileService, walletService, ongoingProcess, pbkdf2Service, moment, popupService) {
var self = this;
var wallet;
if (platformInfo.isCordova && StatusBar.isVisible) {
StatusBar.backgroundColorByHexString("#293C92");
}
$scope.$on('Wallet/Changed', function(event, w) {
if (lodash.isEmpty(w)) {
$log.debug('No wallet provided');
@ -87,7 +83,7 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
bitpayCardService.transactionHistory(dateRange, function(err, history) {
$scope.loadingHistory = false;
if (err) {
self.error = 'Error getting transactions';
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get transactions'));
return;
}
@ -120,13 +116,11 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
};
this.sendFunds = function() {
self.error = null;
if (lodash.isEmpty(wallet)) return;
if (!wallet.canSign() && !wallet.isPrivKeyExternal()) {
$log.info('No signing proposal: No private key');
self.error = bwcError.msg('MISSING_PRIVATE_KEY');
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg('MISSING_PRIVATE_KEY'));
return;
}
@ -146,10 +140,7 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
bitpayCardService.topUp(dataSrc, function(err, invoiceId) {
if (err) {
ongoingProcess.set('Processing Transaction...', false);
self.error = bwcError.msg(err);
$timeout(function() {
$scope.$digest();
});
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
return;
}
@ -178,18 +169,12 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
walletService.createTx(wallet, txp, function(err, createdTxp) {
if (err) {
self.error = bwcError.msg(err);
$timeout(function() {
$scope.$digest();
});
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
return;
}
walletService.publishAndSign(wallet, createdTxp, function(err, tx) {
if (err) {
self.error = err;
$timeout(function() {
$scope.$digest();
});
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
return;
}
self.update();
@ -205,7 +190,6 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
};
this.authenticate = function() {
self.error = null;
var data = {
emailAddress : $scope.email,
@ -219,7 +203,7 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
bitpayCardService.authenticate(data, function(err, auth) {
self.authenticating = false;
if (err && err.data && err.data.error && !err.data.error.twoFactorPending) {
self.error = err.statusText || err.data.error || 'Authentiation error';
popupService.showAlert(gettextCatalog.getString('Error'), err.statusText || err.data.error || 'Authentiation error');
return;
}
@ -231,7 +215,6 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
};
this.authenticate2FA = function() {
self.error = null;
var data = {
twoFactorCode : $scope.twoFactorCode
@ -241,7 +224,7 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
bitpayCardService.authenticate2FA(data, function(err, auth) {
self.authenticating = false;
if (err) {
self.error = 'Authentiation error';
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Authentiation error'));
return;
}

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('buyAmazonController',
function($rootScope, $scope, $ionicModal, $log, $timeout, $state, $ionicPopup, lodash, profileService, bwcError, gettext, configService, walletService, fingerprintService, amazonService, ongoingProcess, platformInfo, nodeWebkit) {
function($scope, $log, $timeout, $state, lodash, profileService, bwcError, gettextCatalog, configService, walletService, amazonService, ongoingProcess, platformInfo, nodeWebkit, popupService) {
var self = this;
var wallet;
@ -33,14 +33,13 @@ angular.module('copayApp.controllers').controller('buyAmazonController',
};
this.createTx = function() {
self.error = null;
self.errorInfo = null;
if (lodash.isEmpty(wallet)) return;
if (!wallet.canSign() && !wallet.isPrivKeyExternal()) {
$log.info('No signing proposal: No private key');
self.error = bwcError.msg('MISSING_PRIVATE_KEY');
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg('MISSING_PRIVATE_KEY'));
return;
}
@ -60,20 +59,14 @@ angular.module('copayApp.controllers').controller('buyAmazonController',
amazonService.createBitPayInvoice(dataSrc, function(err, dataInvoice) {
if (err) {
ongoingProcess.set('Processing Transaction...', false);
self.error = bwcError.msg(err);
$timeout(function() {
$scope.$digest();
});
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
return;
}
amazonService.getBitPayInvoice(dataInvoice.invoiceId, function(err, invoice) {
if (err) {
ongoingProcess.set('Processing Transaction...', false);
self.error = bwcError.msg(err);
$timeout(function() {
$scope.$digest();
});
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
return;
}
@ -88,19 +81,16 @@ angular.module('copayApp.controllers').controller('buyAmazonController',
$log.warn('Could not fetch payment request:', err);
var msg = err.toString();
if (msg.match('HTTP')) {
msg = gettext('Could not fetch payment information');
msg = gettextCatalog.getString('Could not fetch payment information');
}
self.error = msg;
$timeout(function() {
$scope.$digest();
});
popupService.showAlert(gettextCatalog.getString('Error'), msg);
return;
}
if (!paypro.verified) {
ongoingProcess.set('Processing Transaction...', false);
$log.warn('Failed to verify payment protocol signatures');
self.error = gettext('Payment Protocol Invalid');
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Payment Protocol Invalid'));
$timeout(function() {
$scope.$digest();
});
@ -133,16 +123,13 @@ angular.module('copayApp.controllers').controller('buyAmazonController',
walletService.createTx(wallet, txp, function(err, createdTxp) {
ongoingProcess.set('Processing Transaction...', false);
if (err) {
self.error = bwcError.msg(err);
$timeout(function() {
$scope.$digest();
});
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
return;
}
walletService.publishAndSign(wallet, createdTxp, function(err, tx) {
if (err) {
ongoingProcess.set('Processing Transaction...', false);
self.error = bwcError.msg(err);
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
walletService.removeTx(wallet, tx, function(err) {
if (err) $log.debug(err);
});
@ -182,7 +169,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController',
giftCard = {};
giftCard.status = 'FAILURE';
ongoingProcess.set('Processing Transaction...', false);
self.error = bwcError.msg(err);
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err));
self.errorInfo = dataSrc;
$timeout(function() {
$scope.$digest();

View file

@ -1,19 +1,26 @@
'use strict';
angular.module('copayApp.controllers').controller('buyGlideraController',
function($scope, $timeout, $log, $ionicModal, profileService, walletService, glideraService, bwcError, lodash, ongoingProcess) {
function($scope, $timeout, $log, profileService, walletService, glideraService, bwcError, lodash, ongoingProcess, popupService, gettextCatalog) {
var wallet;
var self = this;
this.show2faCodeInput = null;
this.error = null;
this.success = null;
$scope.$on('Wallet/Changed', function(event, w) {
if (lodash.isEmpty(w)) {
$log.debug('No wallet provided');
return;
}
wallet = w;
$log.debug('Wallet changed: ' + w.name);
});
$scope.init = function(accessToken) {
$scope.network = glideraService.getEnvironment();
$scope.token = accessToken;
$scope.error = null;
$scope.permissions = null;
$scope.email = null;
$scope.personalInfo = null;
@ -25,7 +32,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
glideraService.init($scope.token, function(err, glidera) {
ongoingProcess.set('connectingGlidera');
if (err || !glidera) {
$scope.error = err;
if (err) popupService.showAlert(gettextCatalog.getString('Error'), err);
return;
}
$scope.token = glidera.token;
@ -33,21 +40,11 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
$scope.update({fullUpdate: true});
});
self.allWallets = profileService.getWallets({
$scope.wallets = profileService.getWallets({
network: $scope.network,
n: 1,
onlyComplete: true
});
if (lodash.isEmpty(self.allWallets)) return;
wallet = self.allWallets[0];
if (wallet) {
$timeout(function() {
self.selectedWalletId = wallet.credentials.walletId;
self.selectedWalletName = wallet.credentials.walletName;
$scope.$apply();
}, 100);
}
};
$scope.update = function(opts) {
@ -84,33 +81,6 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
}
};
$scope.openWalletsModal = function(wallets) {
self.error = null;
$scope.type = 'BUY';
$scope.wallets = wallets;
$scope.noColor = true;
$scope.self = self;
$ionicModal.fromTemplateUrl('views/modals/wallets.html', {
scope: $scope,
animation: 'slide-in-up'
}).then(function(modal) {
$scope.walletsModal = modal;
$scope.walletsModal.show();
});
$scope.$on('walletSelected', function(ev, walletId) {
$timeout(function() {
wallet = profileService.getClient(walletId);
self.selectedWalletId = walletId;
self.selectedWalletName = wallet.credentials.walletName;
$scope.$apply();
}, 100);
$scope.walletsModal.hide();
});
};
this.getBuyPrice = function(token, price) {
var self = this;
this.error = null;
@ -122,7 +92,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
glideraService.buyPrice(token, price, function(err, buyPrice) {
self.gettingBuyPrice = false;
if (err) {
self.error = 'Could not get exchange information. Please, try again.';
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get exchange information. Please, try again'));
return;
}
self.buyPrice = buyPrice;
@ -131,13 +101,12 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
this.get2faCode = function(token) {
var self = this;
self.error = null;
ongoingProcess.set('Sending 2FA code...', true);
$timeout(function() {
glideraService.get2faCode(token, function(err, sent) {
ongoingProcess.set('Sending 2FA code...', false);
if (err) {
self.error = 'Could not send confirmation code to your phone';
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send confirmation code to your phone'));
return;
}
self.show2faCodeInput = sent;
@ -147,13 +116,12 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
this.sendRequest = function(token, permissions, twoFaCode) {
var self = this;
self.error = null;
ongoingProcess.set('Buying Bitcoin...', true);
$timeout(function() {
walletService.getAddress(wallet, false, function(err, walletAddr) {
if (err) {
ongoingProcess.set('Buying Bitcoin...', false);
self.error = bwcError.cb(err, 'Could not create address');
popupService.showAlert(gettextCatalog.getString('Error'), bwcError.cb(err, 'Could not create address'));
return;
}
var data = {
@ -166,11 +134,13 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
glideraService.buy(token, twoFaCode, data, function(err, data) {
ongoingProcess.set('Buying Bitcoin...', false);
if (err) {
self.error = err;
popupService.showAlert(gettextCatalog.getString('Error'), err);
return;
}
self.success = data;
$scope.$emit('Local/GlideraTx');
$timeout(function() {
$scope.$digest();
});
});
});
}, 100);

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, $ionicPopup, txStatus, gettext, txFormatService, ongoingProcess, $ionicModal) {
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $filter, $timeout, $ionicScrollDelegate, $ionicNavBarDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, $ionicPopup, txStatus, gettext, txFormatService, ongoingProcess, $ionicModal) {
$ionicNavBarDelegate.title(gettextCatalog.getString('Confirm'));
var cachedTxp = {};
var isChromeApp = platformInfo.isChromeApp;
@ -198,7 +198,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
$scope.$apply();
};
var createTx = function(wallet, cb) {
var createTx = function(wallet, cb) {
var config = configService.getSync().wallet;
var currentSpendUnconfirmed = config.spendUnconfirmed;
var outputs = [];

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('createController',
function($scope, $rootScope, $timeout, $log, lodash, $state, profileService, configService, gettext, ledger, trezor, platformInfo, derivationPathHelper, ongoingProcess, walletService) {
function($scope, $rootScope, $timeout, $log, lodash, $state, $ionicScrollDelegate, profileService, configService, gettext, ledger, trezor, platformInfo, derivationPathHelper, ongoingProcess, walletService, storageService) {
var isChromeApp = platformInfo.isChromeApp;
var isCordova = platformInfo.isCordova;
@ -37,6 +37,10 @@ angular.module('copayApp.controllers').controller('createController',
return new Array(num);
}
$scope.showAdvChange = function() {
$ionicScrollDelegate.resize();
};
var updateRCSelect = function(n) {
$scope.totalCopayers = n;
var maxReq = COPAYER_PAIR_LIMITS[n];
@ -183,9 +187,7 @@ angular.module('copayApp.controllers').controller('createController',
if (self.seedSourceId == 'set') {
$timeout(function() {
$rootScope.$emit('Local/BackupDone');
}, 1);
profileService.setBackupFlag(client.credentials.walletId);
}
$state.go('tabs.home')
});

View file

@ -1,69 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('disclaimerController',
function($scope, $rootScope, $timeout, $log, $ionicSideMenuDelegate, profileService, applicationService, gettextCatalog, uxLanguage, $state, storageService, gettext, platformInfo, ongoingProcess) {
var tries = 0;
var isCordova = platformInfo.isCordova;
ongoingProcess.set('creatingWallet', true);
var create = function(opts) {
opts = opts || {};
$log.debug('Creating profile');
profileService.create(opts, function(err) {
if (err) {
$log.warn(err);
$scope.error = err;
$scope.$apply();
return $timeout(function() {
$log.warn('Retrying to create profile......');
if (tries == 3) {
tries == 0;
return create({
noWallet: true
});
} else {
tries += 1;
return create();
}
}, 3000);
};
$scope.error = "";
ongoingProcess.set('creatingWallet', false);
});
};
$scope.init = function(opts) {
$ionicSideMenuDelegate.canDragContent(false);
$scope.lang = uxLanguage.currentLanguage;
storageService.getProfile(function(err, profile) {
if (!profile) {
create(opts);
} else {
$log.info('There is already a profile');
ongoingProcess.set('creatingWallet', false);
profileService.bindProfile(profile, function(err) {
if (!err || !err.message || !err.message.match('NONAGREEDDISCLAIMER')) {
$log.debug('Disclaimer already accepted at #disclaimer. Redirect to Wallet Home.');
$ionicSideMenuDelegate.canDragContent(true);
$state.go('tabs.home');
}
});
}
});
};
$scope.accept = function() {
profileService.setDisclaimerAccepted(function(err) {
if (err) $log.error(err);
else {
$ionicSideMenuDelegate.canDragContent(true);
$rootScope.$emit('disclaimerAccepted');
$state.go('tabs.home');
}
});
};
});

View file

@ -1,11 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('glideraController',
function($rootScope, $scope, $timeout, $ionicModal, $log, profileService, storageService, glideraService, lodash, ongoingProcess, platformInfo, nodeWebkit) {
if (platformInfo.isCordova && StatusBar.isVisible) {
StatusBar.backgroundColorByHexString("#4B6178");
}
function($scope, $timeout, $ionicModal, $log, storageService, glideraService, ongoingProcess, platformInfo, nodeWebkit, popupService, gettextCatalog) {
$scope.openExternalLink = function(url, target) {
if (platformInfo.isNW) {
@ -20,7 +16,6 @@ angular.module('copayApp.controllers').controller('glideraController',
$scope.network = glideraService.getEnvironment();
$scope.token = null;
$scope.error = null;
$scope.permissions = null;
$scope.email = null;
$scope.personalInfo = null;
@ -32,7 +27,7 @@ angular.module('copayApp.controllers').controller('glideraController',
glideraService.init($scope.token, function(err, glidera) {
ongoingProcess.set('connectingGlidera');
if (err || !glidera) {
$scope.error = err;
if (err) popupService.showAlert(gettextCatalog.getString('Error'), err);
return;
}
$scope.token = glidera.token;
@ -81,15 +76,11 @@ angular.module('copayApp.controllers').controller('glideraController',
this.submitOauthCode = function(code) {
ongoingProcess.set('connectingGlidera', true);
$scope.error = null;
$timeout(function() {
glideraService.getToken(code, function(err, data) {
ongoingProcess.set('connectingGlidera', false);
if (err) {
$scope.error = err;
$timeout(function() {
$scope.$apply();
}, 100);
popupService.showAlert(gettextCatalog.getString('Error'), err);
} else if (data && data.access_token) {
storageService.setGlideraToken($scope.network, data.access_token, function() {
$scope.init(data.access_token);
@ -108,7 +99,11 @@ angular.module('copayApp.controllers').controller('glideraController',
$scope.self = self;
$scope.tx = tx;
glideraService.getTransaction(token, tx.transactionUuid, function(error, tx) {
glideraService.getTransaction(token, tx.transactionUuid, function(err, tx) {
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get transactions'));
return;
}
$scope.tx = tx;
});

View file

@ -1,41 +1,34 @@
'use strict';
angular.module('copayApp.controllers').controller('glideraUriController',
function($scope, $log, $stateParams, $timeout, profileService, configService, glideraService, storageService, $state, ongoingProcess) {
function($scope, $log, $stateParams, $timeout, glideraService, storageService, $state, ongoingProcess, popupService, gettextCatalog) {
this.submitOauthCode = function(code) {
var submitOauthCode = function(code) {
$log.debug('Glidera Oauth Code:' + code);
var self = this;
var glideraTestnet = configService.getSync().glidera.testnet;
var network = glideraTestnet ? 'testnet' : 'livenet';
$scope.network = glideraService.getEnvironment();
ongoingProcess.set('connectingGlidera', true);
this.error = null;
$timeout(function() {
glideraService.getToken(code, function(err, data) {
ongoingProcess.set('connectingGlidera', false);
if (err) {
self.error = err;
$timeout(function() {
$scope.$apply();
}, 100);
popupService.showAlert(gettextCatalog.getString('Error'), err);
} else if (data && data.access_token) {
storageService.setGlideraToken(network, data.access_token, function() {
$scope.$emit('Local/GlideraUpdated', data.access_token);
storageService.setGlideraToken($scope.network, data.access_token, function() {
$timeout(function() {
$state.go('glidera');
$state.go('glidera.main');
$scope.$apply();
}, 100);
}, 500);
});
}
});
}, 100);
};
this.checkCode = function() {
$scope.checkCode = function() {
if ($stateParams.url) {
var match = $stateParams.url.match(/code=(.+)/);
if (match && match[1]) {
this.code = match[1];
return this.submitOauthCode(this.code);
submitOauthCode(match[1]);
return;
}
}
$log.error('Bad state: ' + JSON.stringify($stateParams));

View file

@ -15,10 +15,6 @@ angular.module('copayApp.controllers').controller('importController',
$scope.account = 1;
$scope.importErr = false;
$scope.goBack = function() {
$ionicHistory.goBack();
};
var updateSeedSourceSelect = function() {
$scope.seedOptions = [];
@ -113,7 +109,12 @@ angular.module('copayApp.controllers').controller('importController',
$log.debug('Remote preferences saved for:' + client.credentials.walletId)
});
$rootScope.$emit('Local/WalletImported', client.credentials.walletId);
profileService.setBackupFlag(client.credentials.walletId);
if ($stateParams.fromOnboarding) {
profileService.setDisclaimerAccepted(function(err) {
if (err) $log.error(err);
});
}
$state.go('tabs.home');
});
}, 100);
@ -140,7 +141,12 @@ angular.module('copayApp.controllers').controller('importController',
$log.debug('Remote preferences saved for:' + client.credentials.walletId)
});
$rootScope.$emit('Local/WalletImported', client.credentials.walletId);
profileService.setBackupFlag(client.credentials.walletId);
if ($stateParams.fromOnboarding) {
profileService.setDisclaimerAccepted(function(err) {
if (err) $log.error(err);
});
}
$state.go('tabs.home');
});
}, 100);
@ -160,7 +166,13 @@ angular.module('copayApp.controllers').controller('importController',
$scope.$apply();
});
}
$rootScope.$emit('Local/WalletImported', walletId);
profileService.setBackupFlag(walletId);
if ($stateParams.fromOnboarding) {
profileService.setDisclaimerAccepted(function(err) {
if (err) $log.error(err);
});
}
$state.go('tabs.home');
});
}, 100);
@ -189,7 +201,12 @@ angular.module('copayApp.controllers').controller('importController',
$log.debug('Remote preferences saved for:' + client.credentials.walletId)
});
$rootScope.$emit('Local/WalletImported', client.credentials.walletId);
profileService.setBackupFlag(client.credentials.walletId);
if ($stateParams.fromOnboarding) {
profileService.setDisclaimerAccepted(function(err) {
if (err) $log.error(err);
});
}
$state.go('tabs.home');
});
}, 100);
@ -323,7 +340,13 @@ angular.module('copayApp.controllers').controller('importController',
walletService.updateRemotePreferences(wallet, {}, function() {
$log.debug('Remote preferences saved for:' + wallet.walletId)
});
$rootScope.$emit('Local/WalletImported', wallet.walletId);
profileService.setBackupFlag(wallet.walletId);
if ($stateParams.fromOnboarding) {
profileService.setDisclaimerAccepted(function(err) {
if (err) $log.error(err);
});
}
$state.go('tabs.home');
});
}, 100);
@ -400,7 +423,13 @@ angular.module('copayApp.controllers').controller('importController',
walletService.updateRemotePreferences(wallet, {}, function() {
$log.debug('Remote preferences saved for:' + wallet.walletId)
});
$rootScope.$emit('Local/WalletImported', wallet.walletId);
profileService.setBackupFlag(wallet.walletId);
if ($stateParams.fromOnboarding) {
profileService.setDisclaimerAccepted(function(err) {
if (err) $log.error(err);
});
}
$state.go('tabs.home');
});
}, 100);

Some files were not shown because too many files have changed in this diff Show more