From 2c89ff7f662fe364ec2572c72386fa043ca51fdf Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 13 May 2016 11:48:48 -0300 Subject: [PATCH 01/51] First integration. BitPay invoice generation is ready. Fake responses from amazon --- Gruntfile.js | 2 +- public/img/amazon-card.png | Bin 0 -> 9650 bytes public/img/amazon-gift-card.png | Bin 0 -> 6648 bytes public/img/amazon-item.png | Bin 0 -> 2127 bytes public/views/amazon.html | 75 ++++++ public/views/buyAmazon.html | 119 +++++++++ public/views/includes/sidebar.html | 7 + public/views/modals/amazon-card-details.html | 45 ++++ src/js/controllers/amazon.js | 53 ++++ src/js/controllers/buyAmazon.js | 239 +++++++++++++++++++ src/js/controllers/index.js | 5 + src/js/routes.js | 20 ++ src/js/services/amazonService.js | 123 ++++++++++ src/js/services/configService.js | 12 + src/js/services/storageService.js | 12 + src/sass/amazon.scss | 22 ++ src/sass/main.scss | 2 +- 17 files changed, 734 insertions(+), 2 deletions(-) create mode 100644 public/img/amazon-card.png create mode 100644 public/img/amazon-gift-card.png create mode 100644 public/img/amazon-item.png create mode 100644 public/views/amazon.html create mode 100644 public/views/buyAmazon.html create mode 100644 public/views/modals/amazon-card-details.html create mode 100644 src/js/controllers/amazon.js create mode 100644 src/js/controllers/buyAmazon.js create mode 100644 src/js/services/amazonService.js create mode 100644 src/sass/amazon.scss diff --git a/Gruntfile.js b/Gruntfile.js index 188cb81b8..3fd51b784 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -52,7 +52,7 @@ module.exports = function(grunt) { }, }, css: { - files: ['src/css/*.css'], + files: ['src/sass/*.css', 'src/css/*.css'], tasks: ['concat:css'] }, sass: { diff --git a/public/img/amazon-card.png b/public/img/amazon-card.png new file mode 100644 index 0000000000000000000000000000000000000000..6c65982eddc51470a7164d19c9af2d45d6f78c25 GIT binary patch literal 9650 zcmX9^1ys}D7pJ8|1Y{_PNQ%_HbO}RxG$P$&qm)uWa&(N4kd4|vKtehNq;%wPbSnx> z5Cjnr0g*qy^Z%anjrVSx`_8-fzVG?mn`C07!$c3FCnFGrl|L0<| zaOX2Y7e_~2QBm9@!GXTM@0*)pA)!KiH?)+1za@O+WaJkY7j!gN1Y~tpFJ%}4&5X>) zI;v3y4uJ~%bYwc|;WlJsx5)IgG%SJ_e-tJmOGQ}Y!A+{+Aq+kT|BT;KP+v>F0xyw% z@Nvgm0-7KhdGp%Fk9-=`kY8zf6paQX28+`m5^urbtN`%eO$!21F)<M4O+GW5oOO2-c;E)xE!?Kz5*#TV>Z?h<^;M#7l!gTmoEFEw@in#{a?y|nPd zql4eBpcvA~6+R!h1mt_*&C%)UZEca~!57CyYoOBN(TJ|@Zbjdk|X-o9xtRFzSc?)p}?3e?Iy znlOl_(s4dWs!y^6-3;e-57vXEK9GG#St* zbWMh3>OclSuhoM${6DFniI>)$?5pw1%KOJ43{mQEY3GNCz=lte*>k1*^Xl95#*i3S z;j19f*YkTKvTaH8N%TmBA>O!+3``F?eGeC@5OON^b$%I-#WgU4)+aN9N^q)QGR)a! zj4%D^`UTR6Nt6jCOAI4G4scl9$CP-Y;+J$mxEdV@J*``CW*V5!LDe7xqJKbD zv-$kT8qT9o13`;1mlDYHbuUlw#%+d*HTGp0QxL9b1h7iBI+u8N+G0%STFxV9x`W2X zRdFH0Ws3K}RXquw6E#wm+xRrcA?$S8Btju*r)TdqTTHuXB^ zQ=+mdgjitUkvE(7`3)pQ;i2!4iai%MzRfH3+n45U^jk{Vy*@E-GHDo)0hO{iRe3T_~Avfa;jt0zbo06F70BT zLZ2Qdn))N-z0JKDTViZ4C9cWm^jtyREO17WZox36Sj2ZEHbfit==pW9jBMA;r3&V# z_?Dx+XxFCy*jK5z5@ZC{e37IRiV9cs7SpucrD9%YLbOr+%dZ0PAq7<;mk^v+66hIB z_iO%@2cq0+3_1MU%f)^hnZ( z=G63Czlxvv)W@sd^93EwqS08zaGCia25xy_kH#gf67zwqGLjL|dvEb5Fa8I+2U@8k zGIH70&_3ve*g&~tVsElm!vbsI=PQ^K{EL4O+_yL$k&pINPPvo5@u*%%*5gk->c3KO zzxiIZ(Qy|MR&v_O7MuU75Dmv_o@vmY>1ISNP{#5yyl{JL^wedS^W(1H%DtWgYI%i- zrv#cE?hS*LrKN1U0!GZ2x!}{}+uNI0!B*AQRH6#q>@3u~__l6&EYL7L_6O%u2z-l&40DZ+C649h<$9c2Z>ybT&m%a%ur`u_ z)!XAZZBxhW(@=hyxfKk{yJx>Pay04j^x+z8Gem@3CWQk3uJq5!y_1I4PEn-H*R^@Nz@PpVUh)lm=GHxiY&JYD?mKexx8l~i`HF5lr^4Owe%u7rAx><^YiZZlsg{JrJGaH`m{cV#dy<{r7M z%NySAkdw6U{SvZO^tN7}W6Gb^R~>o~xBU2l5cB>bVr)(I`KnhIvre>zY1*sczv0uL z+alyDBD@|8bZ;$F3VZ8M%S}P+N-5u}4(RQ4KhZs>SL8>H%x?=HH&v2oec#wf?iODa zrIFqy_U%ni-FHPdq#*9coWMd4wh2$S+fKN7?>9S#-wdI@kHR(6L1R2^X-+~=bOrBM zsw3FW>C0ZA`t80sZns9hgzhnI3BSoW`6*dn(9rG0{91(^Q21SKuoPhuSw8x!GBR$J z{Ju%V6|PaUUrx;8s#rWn88w8%HkO4&{?`k3!>vNKB+iUa(QKOevO)5HA42akRgqrx zwLJ{`GkgEDN4}m7S&p4qlO(Wg7{cdz-57H5n;Ao6g;bzgMFee<-RQF4Sj-(_@y|X2 z`*d;TU4({d9wnYFZWo9E=O$O~g1oZsr+E5e$)A4VYG}h)Rx8*C<_c9EF1=gPg><$~OPFa-vX z@>iiu)-Aw)+*=04)vceCk$=p}^7@f{J^nhx!0Vay&#@-Lt3szJvScD2J_{1{J~7rdik@w#=DRl zl%wpPVauhf$qM|W_RL(7?rTWnB$87}W=uNeJ4d>L*@awPUscvi#H!(f+_^`n(bUR8 zw&gq71Tj;LDWo*6>YDbe^*5YY>q=lEg?6IzO))3vi#^YLaE%&3&D^L0*SDpRQXsp( z=COXCm44?;$u$lun(=ZITj__0vN2g*ot&p3&|r{ESW%ue8XXPxoMvih7&Ux32>#vl zkwwXL^%az~F(;^_%6u*5gAzO}0sn4R)AgeZHoBAI1*~q!_;e$Q*Q#+z zRnMcRR@(mk0rbJ|7+rf+_WeO1>33-Y_hSlGo3cIBMDo7t!EGE7*@G#`8A>k~21Lkh z{grAcv&(_|gzwuzI&DF^!*s>(*&fa%z%@xB_W;~p=@FuUIA7CK%vOwyX9>f6ea48Q zy)RH&<-!Gzl^{%~RHQ7wx0)%tc1xIRdWQj(Z;76GlMjcBgMX2|Gmdfa7;xdk(3VZ~ zU5J&DA2f4-qCFKXQW33PdRqu&i&cZ|&5=#Zz^BP7D1+X^ac^!Gl>If4vyNXS6|CT= zsugG}P=iy^TRM2XaT7PlLcIL=-oB<46ZgK~Y1S=r(U$&Ug7a|<%~_d=zuBP1+D$T3 znLsDQBBpz{wZx!Aw%tFpn9r&>wuoVP#b#!X%Y*8cK~8ExL)eSS8_Y}&FZ&Gero_B3 zdZ#`wsw8l@Ah@`T&%e$B=2Z0lf$nuPxpG}jia6lAJG{?K5e(~l@hli&cJI+AN{sai zn`8yxSx!}3V$XuQ>-&?1bx0Fvsf0zD)94EbWz!_zQmBmhl4Sfk+>gnp@0?eP| z%^XhF)lk2bp0qr>JF96fXMTltU75$cRZ66P^0(A$AXJiRin_CCAT7C`zWEdp70C$X zKY2cxu|!(5`%xx3U=xp@8KP!pjiq^cA8WO`2x5S`ZuwaLh_6jXbPUrV!nt#v+e{_n zPEd}|L&<=TMHPN61#;KFI*7u^K;Z**eD&J^4XAs6sCHFkJpO6*KK*Em_q;n*)<&G> zPWg>%x!XlnM>1Mlc z6?n4r8TWIJ6g(a40?($_6y<-+kP_lzzgBo{qpoel$7@(M{ggE;Hm24iPJ7cn(N`4b zOKh9j)o<)f>3ZLwMN8f~ZAzA#Z?YHe1AE+dRf?`87TX$0~QE zx;T}24l1h+l;e3WM7R~k$&SX5~_zk-ydsPG_SI-JeD#ZhKA{yz>_;1JR{UodX-dTJavAbb{G!Hpj8|wa?|t-#|mNr*vVz}EJGu{ z4M!fj(GyZhKHo%iLgvwRp=bP*T_S!9kVi$dpp2hbcIMM}_Mf#=q5tQ$cStyDeVcY}rV{n!03d?J4ih@}8NB4QeAz&Qpav z-KIiA%xbbB)2t632hiNOY9ukGu|_xB0oiZ?(q}g{!OlvMxHj`F*z} z()njJlXZw?eYLfmf^<;)n=J6>>ra2Faj+$uthVq0k6adylwV2EqbB?kBVIl0)6w`D zc1`Fe_mimS@K?d>F|{f7LkT+ou*kpbs_=4|yT^=baVmMZrgt~3ekr2{I=M%Q@4)SU z(C#cNXefKH@ODvmFJtrN?}oD>RK24~fNq$RZw~$xh`FDLdkJEA9~kk`s9eg84{ zQxMDGH3zSM*nkD^QZK)YKN=j(*_$+mZIosBi7hlqz}CZFC$hF2AM0kCjfXuJdD1@kyWi{$x^KXbwJN~ zSd&QHb$ouoWueBm99cKF&Zeh0u49frsmK(n6DvmDOXb+^eL3a+njn9!{{ zYw2^{44i3Qp}mSGMctKDrv#Yut45l3JdTEHp5cU*0#b4o2WH08m?x&iWuoHID#>G0 zuQ{aJx?VTxjF8dg>wR||3Vg&u&B5KOBc@pS?{ke@^yw?j0PKhg3m|9LLVk$BCHe7d zN3uWYR%LS1BGY9=^@f1hRr#%SrJX4RPV^-lkIfgd4a})F+>QSk%`8`c?O!?qQk)QXzYMg=92gL_Y6V4~xQz%5sI!{;N&4K-{fe;;NO=j0;~++< zRz2xt3mEpwx;?qQb#5*$%DPv&?GJAgu9VgNH6!eJ6{K!mxBWm&1xxQ@MA$cb_#2EJFl#%-BD_OO@(cXVu8E@QTHMrzY%AZ(G|jp$ryjdpNBt zk_<~=%$QfHPfj=V9dCl9!}*t5ez0duCfZ{s1YKqJO6{w5B=obw7W9y?s{8!k>6={` zp#>ozi%0V#eBI?X{Ka@}16oXWC}?>TgnNaN2nWV4>ChLu&zQGMMAmsB0&m?8rpxT}lduaMm}wQ1RPaJJ!=BFzwM76Z zf;L%iD8P;S$Er2gWcuZ1?A!y0!M3@?)0hoh0?p0TXz5?LVf01Gb+}pWN7cE-WgaTR zcf}{wY2~xd6qw>Z8HyUH%kmu{jqXuFBayaXrRig$_4DK&n|X1mMq}jis#)%4$tA#% zY#p`1mm?gj^z{~iPO4Y7OUUY+2?!ZDZSmY^mwP0Ag{g*T9?BUqjogq>lN!>0(|PTF zCshc!6;epsGjN|{dW=JMHC!UQ~<5I{yQ^-1s7~ zQDsPps&wD>iEq2E{>;2|tvTMRDp_-!KR~vh2GfOH)qO}sa_FcK>a}=UMFAu^_3nbEG1oHHLdPj zT|HVvE%#Xd1q#%Ys)Rr|%JIE1J7^&&($bwxgI!cssN?0upR+FGoDQR_7<@2zG?QC{ z{Q=bX7+&>5@0+X8*4u?pmlLsyq--I6gHrkaA!KKkjB70cLP_p+!$f27tg1oh{!3cCvpmqs&W)cs|p#cb*=_>&Lm&_er5*zFLZEu~Q6 zEAxPnwwGTgw4@;V0UepSr4wA3GzDsnfP1j3HSBhp(2U70F+eXcAIlFHtgs{p6J#;KU7m!B1w zpw;fc9h6snr^^OPv0tbNEp{0A=tQ<(j@wO*0M(b}9i0XcqMd}n)UvWcmjBgDmFCYy z891m2AFv2loSw+9+i)XBsF_;c%1RkO+=vMprlt_e#$P6rfmIB6U)Y$)$^bQ^li{Kw z=v97UF~MZ}n;}Uy`s`Pr-*Z3fstUj*sGv5zH|sp82n#sp<9lMpbUSpItTVv<29N|b zyv=o&787t6`aZCHmwiuXI7=>>4G^{jNw|P)gnvh--s`;uH+lnXR|J?}3<76b!~!$K ztcO?U^te0^@)9A;)^Bp4lnVy%UxeTiC4kp60q^cGi^8w;?7%k*OiohU;lFfSv&#Ut z##v`oE_`Y16#Wk{q=jS7#$atnjS~B^NGd|iYdyQ`Hc#W8b@0NFRuG~J8KybOvi3_ueV_AZ|15@Y>Gyt528ieA{ZAxxyuQ4uJydQ4A*Dx(dK zT9xge$v<6rfeq36Gc6=3A|vf-?J23=&IMkb4WuHVv3l|Xn_rzMVe_QX-SRzyTX0@7 zLi}hUhT)iT(W}V;_S;ox_7WB4B`1_`7v}!?ngc?Y)a0w8lLEbHF;fzE6ufPoFI)*? zN-Vi|EGYDp=@Ru!G;c!WZg4E0O>ka)*;un3`V97U8H6P96PuSRIx3$B{%+NWP+q!@ zSa(|jT?e1EpV=jDtkiwn%hsUx5~~$&%`u9mTsIEJ*sBeT?*;u0jTFhK2Y!h806AKjsQxT|NBgWLm`VhZa@@X;ECa&_% z%tqk7**kGiD#C-;bRYk{ux*OtMv|_3{`UGKB?J8}9uVZ%P<=^Ne2sXjQN9ko=PgvJ z_cWRgLs_}?s39iF)9`UrWs{*vQ|6_Zh^Jf%)b*aZe0VOaEY#lHH6E*I;w|TFKFWD# z#Y}kcerJtC(R(2`S_~ylZx1{rl7r6ScDoWTBmbWP`_qSVRq)b|%pU?aQ>l+p$FY@_ z&zvq*fbu`-=CD1~|6PS(;NAS(KJv|X@n+s7_8*1Xv9yq+H4^YKvv+ZM=&-0G#4eaS z^18uS`Es%Q(;~j1PhcE6as!^vo!t0Zj)vx&P593|ayDk`ldy{Ha*b%-xs{3a!_d;$ zPly|OhGS#fx^G12-z6X}qx}PlMi{uB6%OjW=2Da7FU@nAl)U@1l)m5Y+Mq&WJMJj< zUo;J7OTH_5Dqsike;Xc*9=yGEgNlg_1Qpge_&O0G5}-xAp#m0WIgCpki{}Sv1RO3G z9QYvY6zaO1{Sz)X{T;EwHD1r*mx}pX#YLvT$LCMxU06Jkq=+Vgp0TfP(@rjp#l1sf z61lJW;k)w6$fM6oS=^%ClQWd;ceKr$;5b^$8G(8GTX|KULgwOiw+NW_2Re)ZZo>bg zQK_8%IVtnxWS9<9irW&_a0y8MY5R_{NWj4D%CZnV?HO--xzOmF#TzV*NbNX1MdnsE zIk%#;a~p78Dld;v+Of|yAcv~lUzUsUmn`=Q;IXfCx1L6b++SR-aGY$QH~mn`or-`c z*b3#z5&Z%s15a5xph7f1M)Sia8pI(}e@n5c^l zUI2+zOi41Ex7e9?uhf7xhRIVv1`t2Cyr(w<`PjdTcuUFn4>uxVf;1TKldEb}1juU* zA^mEm-@b1L5{I4Q%&bj=6BIQ9u6l+J3LQVBwiM54O-FRf3v|hj+ARrWnN?jTi1vY+ zs=u;)_vBep%f+Q0x=8^-Ea#kP8^!Q<_1_>TJ~a!$8lET}>NN z`Ph(p^_}-ZJXs9G1TWJ+?6mQgoXwN$ul2XcO}kzzbA$7lH90~vFu9VPY`#(&0kQL| zo60=MEbh;FNpXag1D>9nk}>R$+?+TV^%Z72`=|(}%+mjM(|^$DG9QmPa4NEC+poVc z<5+(6HKWq*9)CnKAqA-3iRW`t%8XjK$Wk&nwG8BbJIj1V_jRY;dTR4+ zf)yAvVPDj{`sr zv_Kz=Xid(%Z-sb;SA0Hwjn8qj;*Z&Z3R9kf<&P@iLob}A>&7EAZ%>6hrhJN&xvXH( z$yJdWe^vXaR1TRX(oydhB=u?=5Bt2UDk#7z;sRp+vcCdz&lX0Vy7eV=SGY$w|JuBH z*vWxfx@<()`>z*(_+gOZtsUx0PTRxD!JPRK9D6#ocytrrb zf}oC(^qnxbWcNF#qs6cfqjpVN<{7BOXORP?Q^?mcPkyaS1ZfdfN|)z-D0oVD{oLo0 z{}f|GY%1n+4WVyn#V1~rzNih_P-vibygc@0BHESMb9t@4e$7>|UVZ?$cu~<|nlPdw z{`VOS|1Cy$#yxz6jXNxCJHHBed??SNAch=C!*gUtuh^GD7jid=WwyJAoR>chrEB!^ zJ~v}0`OB z-egTY>6|6p>AwaDx;058Ntuz*79a283!=rOTk1oKq?mrjT>NVyh9%%mX7vRIgd2^4 zR|W@M$cm7%1|y~gVNj6)_{&sq(NE=t3M;;w2Uu$p(AIRuG%FC9Y0&f<7^&p9%3EH2 z#z>fR8)7Pw(qlq7z*B?F5SThdna1y=SELzL%yB*O4>8R3Ov~)xD=zDC;k%x1IW#*{ zjw3T&t$zKp2vbDrG^=dgC}WQz4sD6SO?O=gwvjAvVwOzcupE3AsDzY*-j5}DJw(*} z$2dL~OJv0MnUyk4J8IALOAe>X7&+tiaehXqOw7f1kHEm%`<1^xPlDYKW=WzIXLFZRdcqQS@eFf!D9wl8a9$-K4-~_unOGf@AR=vV23D zN7K439V_(X^7e~4_^o(f*zzYp#ub*GDvlNwkiE*IgLUC^J~CW{9YMKbtA1EjK(fOU=+ltMG=^|>~$Ux*Nr_IZZ7#~ z2p9%qMEQBv$nQ8q*6m(gR~47Z<$iN3g|szFWis-{)JCAvbpDYq-0tyTN;d%fHt45t zd*7(OYoYV@+%0d~f>8?B%!w237LH@(Rq6y>gAHW_>I41>WDU7S;CF2d?HfYSgVyM; z)bsmGFr;eJEOR#*R!+lE0^ZHqF){TG%esNyga_#(TqM8PDCj!UqMwf3o?koWj>9) z8aEU}?XmE9s~O_c@gIUufJ(Hn8@fCX9YtdJ<`vd0U33+dlFBcWo2Li6bc?71L_m0P z?v2xqk@TBUsRmS$#(rQ*RFg4tzNCWEC8y*c$@x1qz-Li?@FPp9t#^_ES5G^7(+dq$ z2R{!1;bj^J8=T#$jOvA1uI>r{!fPX?#bHK0_S%o1ii@DWEroe~Tr5n)bKr%^C>Iom z#=QaKSxq#s&lP`okn%4aA6XdZuQt?(uXzZvD>y>kmeIL-ein8S5njsIJb8HD!UZ@= zr!DyzF#DgaqO00A(+ z2u8orBY~={%=|L5{)AvK7z_r3!C){L3qJ}vib5K z|MkZp|K~dYoadh*eg@jtcKIj8&+|Y3`DfE)hw?TKl{U(@L0ew)&n9or&Y_>OU-B7g z;5JA3KXLxK%s=vf>&Wo)oPUzM4N2dWF_%M(egB4Xka$MUoeZR#1H}+o5HlPhxiocPz0PkK?<&S;2(rirnsvk}Js?HJu8tN?$ zj4fcWmicF4V>mc?PbFVT^XFY?ZCq)N#DrP?yN41YxX(X#70&==ocbydw)wt*00f~8 zj}CGL`Mem2JQSckQ_J?;qizj|{f04IJIEXKV@%Zz)WJDHrxy6z;KYDLFt^Z=HMS-5 zc;^6Z;MPJ<610hw_>Md5mpZN^wcYu59#A)`{L7@w7Ey*PCAcf}Dfp~ZoG3mK6l3K` z1l9wmy?aYA0#KkN|Lz#uNkxjk-DyhmL@@pXyZFgv!)i^jhO&eRAI+CV~9jJi!E*$M!+VcQ)bZGJ3iK)L1 zzQI{`eZc1m#dr%u1_C3ECmf*ADecPgXG8Tj*w?Lt5sWeFv^BVwKx81W%`c(lT66hh zfDYl_v)|h~`i;-LcWBQOI!dM zLD2^_%XJXK88v`;0C`tNhn{2UGe%=16<0DCR*WN*GH&wE*MI)=50rdI__sI< zRt|h11NMzFqd?>o5u)=u&s3Zwk2YrsIOcU3*(yLp7s?6v=ynkqfa8K1`+goy&VND8 z9p|ww3Y=RcsuxL=WynxZAL(;{*aje@Nx;BQ?>qGMU|t5_dr?Ay-wi%2MN)ZC!>O_|R{>-!gg-d}6%T9$>X85%x9UUHd^-Gy<7ql(H{+UWeXO??S z{xZnvgWZW$68pC5Z-su6mxY%s$1dErbP6S-bHZ;Pi4M9cq*!On zi0QK^iNYq@bATXj0<@8m4J|7i%&zH31p@>s87xZ3;F>6dSw;UTQR8)hxr7YKO|4yL z4mxFn>k_AC`%aUbOwRW<;5*BFgH3tZcIS8EqEDvGxg_I08GJSfaE(GXIiDSIW7*#g z_F?AfKxAb4P@*Wlj(A!j*OXZ1cqV)&4k1)!7d4fX%XTMU5sk8HynYZKGYBAqsmUqX z=#)e4`N|^zqsVDsXjAMVXDShukzI&)|18nT%<@?$yF*#xi>C1VG`T>zqU8jz5alaPs3et8qPVz07X&J)gT58X zX`qeq(7~q4-kasmHQCCZjEH?nEMJ=jdXA_u`|BnlR5-LYA_?@Is{Z|~iOiCg$`vw$ z$Re6fE661ZFb2PzB;k2JD?>I-JB^ZT!pH7_q`zx&O9?Vc0@%{9fbgpNvkQ10)Zc

5?qRwtRS+8C|ea7;AEfrX-uwI@4q8{Jt3T1GYo9NbrZtRs^EyIQ#L5- z&#Q;-uSI!zD=v|*s6l?;0tN+528&Dx70yB)g&Vh^{hhD*A*se~kgH{>XeX*mMZV72 zE9!R4Y>%N+!xpvWXH7PFl4k?;ju0G z(sb3;Hf4)-w&k*eZDt&c5G?KnV7Nu$*DY(;okg2Ae3?j4oVTbgDGvt|f+;I-If9l^ z?sV%s?bN4TG7F>tvVutm#2s}=HQJ;Pbw&6wdw>oSf^s~ui$NudF-9!jAY`C!NUKY( zHm9&onz%CZ#0Y`GXaznOI0vdRB^WK9;qkO1JT~ExMf-tdZR+zA3?o_Z|=eMvD{$Tz9B!aCG3_ z4T_O08{QFqFX*MBsYlyF_i1>f_tuH*2!v2X)aNyg&og_2_CqZhQI{P4V6j<&y54&e z@L5$P6^pRDkwZ9UYTqd2nssF2yNVFbJ;qqSs&prmBjQWO#g~M>S@x09QbPC^(7-QQ zw003KF#`9F7zy|1esI8ecD*|Ouptn##FTLP$S(hVMreB!P@bKdP%b%QC3YO+sDSX7 zieoO^Q4BibL8wJ-=Bh#m@Y&WNt9GXXh-FiRE+3GFa32BrU#Ag;7EX zuNDTsg&nR?KEe+ukIiN5D(-M;W?%7aA=fvo$4j}cP_8an)VyVLGz(&u009T+*BE8+ zV4+({$CpGG-2r@08B5$)YO1HJ_2w226$B+W#_4Fr%s}A(|Yc-Et^oczPc7RL6wjdRD1YNLRp;6i-I zKt%mJ1V|ODc5Iw-MjRK=t4rZurj!R?@cOaG-g4r z{Y^EwrUhv}$n~Ox40g)D@Etg|9KOG>HDLHY{_XU(+LL0SMZ5Y8i=qo0RNt2nF56L69gH z9`YpAOGWu?ENIL{qKRn;g}-d z?2rHXzl6kxq#)v)Ffr6l2J-moP=^YB>rmeh=7DT^Ms6!%v{>L^MaxSwN2{bnR z-=M1_)~sGZKTOhg6&w?S4|2yp$&F5k->Wac@Lux2t@D3pJb4)u@}@J0c;sP*srbEY z?_jbRogv@~$H$aay!KUCdH5O^9Ak7$MPCU)4L-8*^vsOmm@TF}H zf=D!XNEeu{n@&oFNuL!?kOF}$*)Y9HAi_)xcEU#Zw+Rxo{Elh4rN6_KNnq?7He4$rxJD8%5$|_#c=(*@sD`9V{Z$FBDofJ- z^vv4AU_v;)0WZ+muSEITF)@DT`S)QN>yP}meBz?n*?}By#qV>J%A#o%SBCHWV2Lsq zObAVq0@SE4a!2+cs;`8UXUN0qB*+vt7~P$8=3sd|#r|k=1EK0s^NvZE!C*o-7BM{F z64aHT-PrYu9K`#aLxK@)()UeoI42M*BtYGjoFExwhUe)S+OnZ+Mz)>n`1Uf})urqD zuJ1OF59<*fpE|1a;N<7R{rH6)I=|;W5QIVim%{##Iw_B7QH>qva`Y=8&q7ZqV?S=O z52g}fhFRZI+dvnI!<)Vm)3Fq&H<21-;NKs#uYS{?C(7p$sNY}LATxO^c9G2XP7vGV zyZ{5|RlXDSO9ozRisRMBq-fm0&LPV^SNix^qOVdW*P{5;-UOeqG4%6br}8Nsr_b)WwhN@6E>mXPO>8t~ie{28OFpvUt)1017o za1wzd;ccmU;h{&M-&=i|^{L`Z*E@g?4UWE;1tJC&(g|N{$|oITsyNBlf~>>ySB%8(4VVK_y|kSPp`*mGLnS&xLs*~CxNb1g{tA(*$DGG^&B#KQiu4kT z)$`HdrzbR~y5mc1vo)02%;5ZWTx&svi=6fMToQhBsk~dBAGNN?dSb1u)_RI^lvzN; zgwS(9bcBQcRlJ{2*~bl48|)j9z)he{V>67$-8kC9 zLd%+m>S2cRN?TR09LGkF&?$~K)*O4SpQeYJ@Z*5 z1X(n$SR6AUoFG(k5bvv$WE3VhceRZm`m&i$uO&Zvj^hT8De3b90-f*{p3eiB7p-Q? z#9_I|hpb)3B*QGmR*ynt#7iawh8_(slt>mna`RWnJpdHvpQ7{6kN~oti2AYyL*De& zkPR7?cQ%N+J}Qco^M4)!wA(dnqaKNJ9x||yayfzEf(apHxdatmU3acJxJXpjN;7d- z!<9!I?C&-{fhBGSo7@5s-Rp_Ss}p@i8<{))JaLgrz>GN&c01;o5Kf#Zl7NxzDMDW& z7y^AhtT1wPm~}h-NC|-8BX`qNf}*NG%$5*Bj{hqY0)xTm3K~DD6P>?$xZLp6Wx|BO zU@(q>OUDR01QCqI`wAyp0)Q+AYWnIiBV7Ts{bV<%F(EJ*44nv|toKym%;mxd`23BI z^x*!5{5juQnoI}`1|uAv#o;Nu!#cABB!jIXE08x39vl|eL&T@7Y)lA@rjd!?la8Tk z(ZdsxU)@V0=LUJgzJx`KNq`TrWI|x{fDi^SVHsfQ>1B`Ql^P=0BtRyhM#4K>gAd~} z*1me-k-$|Vtp$DoJ8HFK zkd+V|XPZn2jE+Fxzj5ms>5ltcGQjLfb$$nj(FMp30IvlO{L$kbbvxGQ&_t;n_s)dC zU^L+1Qq93dc;StU0iVkG^*V|A_E}&3lhn}W?+wdjjQZe%t5dg6CIrSYpr4h0?-)_e z#c7;hzce^Mr+zD^{7Pgc$E6G$-vMnK*Bn^v#K%i`?p&XT`Zqpx!(>8W93x9uYgxj6 z-MbAbXxB9EdM+=J)mr=WlVe1zU$mo^g?51=W|zzELlEVyOJIR=T(M;`Aux^y{el;W zDz^n!Ivzxy`R7TC=9Vq%+qW8?In^BY5amU7y!m(M;^S>->QU2)Arpyh94p?DES++u zjc;h8Obl7V%2Fo!zKetjfx&1#>fK+2ZYWWJLBE0Xf=NDbNcg!!B6!oB+O!2moN51k z9ePp~OC-9yBq_uMM-36MUQ#)@CmF{iF=Qf@E5VS+;j(+#mW`HuM3U?S)cOzlU?9pj z3X$P=^i6ovQ?^Uqhrl={DXj7QdA*Dgq4TP$3B%1=i-1cGUHbvIZDmRnJU~Yc&h-^D z2KfJ`KFc`qGN6f8-WV$H0tdXG6Hrbgy~1otcfyN;o9brbaQUe$=gH@%xMxA0Y$|UY zR5Jic_IkFrLSh1Z3PqIpGe_vy2L}18GLgsD4^b|$fgqu8oFOn6M{=g%l+MJ*8hKSj z4tMT8w5ThOhHM8M+N(=#17_x=@{7 zf`13YJ!{)VLP$=FhTi2uqGTdP$7ph}RahuwASc5oqJc?&B!vryF@U~ac;4&X8*s^p z(JEpPzwf!O15;v@u3s^k5!*k_Bhe*BpHYEB4k;_R3w(x|$dxc(^O_-<{;+X+NVsQM z_rEOZ)Bf4w{c6vwfLzvESub-K6RJ$)7?jDRw9VSsr>A6tpV$pCx{lldJcz^1S~nc= zF&La7FuLKu)o5`S;5g^=x*~A~g9(Abs25w!d7pWZi@x)A*W|5Y3`U>8lgf-^Ky}!W z=dw|KX)2eB7z`!^Mu(s;(VV+%R>HOL_Z81(Fc?e-j22@pKJG5HJ#t{bAxryn(zfNO z3`Up0tBe>&0WN3M4;0J9`%c+S(RGcu16OYLQUTw;2ypuvgTaKrV6=o3B;>sb^70l~ z3m*ydT6iFX5l<#F7)%I^Zj%D65c0X#07&D8$$-INLSXbOTY&2{si%Yj0WA6a83uz1 zfze-LkS9{c1z$LhGR=8`0rCGSunI(1N@&Qx#j`~E(k=l6S_=l6ZS-{<-L^UK}svr|pkP#FLKsF6He z_sULFnL(6*vc0J3ppWcWALZoj1OPM?sH}u5$YM}}M-U4DP|;p9IY31f1OSi=qWcE2 z1HH+F$an@SoDv^FMR6DjGBf}{~-h;*+RQ8x$6WfjKBcp-^HHg+|!x>i(l#7TLq1+3W-Y8l94of=aPQ#V19fE%A6f z8e@gFva*mNELew`>~M|+lV$Rq`J0jWy)*(4wl4k$p6dz&>^DN#Q&$6?~{JZ z%0_iiCZc~nn}agB)hq}A0OpZgoqRpi#Qw2yI(|A|Xer4li>tGH5pRRd;di+puyK}0 zd$5KZ6ze$+UMO8rG|A0{17oln69tCjiXacJ2wKv(ITLQG)3$+b7)ie^keq4UKO&in zOioTAzVd1IJ&y3x29LfNvR-=eK{B85YE%x8JN#8>Dn}dogR18(o<->VZDva9bQ%0= z!-p4x{D0HEiDEC;O=5MF6^;Q&PZlEjYH0n8#_0J!lc8oGDhnSx?`9L4x8n=fp~K1? zh8*K|ruE^mn6&PV(G@w{SJMS-mHjlgpv;BJK8@iAJV?X-^>-!mOi_RenOwV^8i zongMgUF4Ci7EmKZOM3dg3!Igwkhw?BvVN>J>Xh)thp+Vv3f~3temp@ zFsP`;EA?c><9kpDY?w!jaBmF!cs~d|jVTu+CO+`jM-s*@vqT_aVi&BhJ5mW`L&8+< z^P8aiKp{F|hD);#rY!brz!Pu;9BpE-Zx8nN&9KjlZub60xnYZ5X2A+`m`#WYQ&_1W$Sy%dQnIf-pRUpH9meWrxKA=&nwHTrnZq1M`9TtCy9N)6jF(#UAL5j$Aa_ynP% z&?_0(0uXhGG)+@)lU{7gV#fk56)!OJRh&$=6WaJs}vOVm?C)I4y&vN9#M|rGs z^6{R~P!wd+s>R*RWcdx=lz41)HDRlA^6cnV;N8`Y8jEs4rx10;$w8UdouFss^}5#) zjjS_X=bdYn51fSY$`J=pj#eb##E!$|YL2(YS}%$#>npQEf`Uk@ieUn^4euvvC&^!2 zaK#;&9$*FDEQ`R;Q84bi7@F3}yK)XBEr%_J6xW*~&u82*KsC!tT<~3o+A$q7uFoSc zkn_T@mp5P5N*X>imY`aY%a$!tMV0W?JQ|w- z+@!#Zg-5l7b9+z^s3kAq_>XVOD@WYz?-hq5XOsTrIg_hev2rV8HFeJpgG>ptj|I!mcpHVsSKs zAtbD8#|f1JVjCZ1IW-ZP>RI>Ieo_2d(hxnAZ~S?0t!53s2mYV(8EhG_2q|V?Ql6cW;ZyK zbo7hVFPfTp4r$TpPdxj0g|)o->+P1Odo?$0=DvRJe(7pGNUhII&|Yd{(DrL#;wfpI zG$LTqR{GklWEgO5i&P-+Uq4EtJcV_Cy&4XE01dPvdYLy_xZ#U!8`=P_=J6&U58XM? z9W!dV5;K)-t8hAv{BD@4s-@y>3ju^=1C_eK`-S%9g7zmjx#B4hY=V7YZf*_-IJHHq zdeAqZS+`l5Sm9EAI%29z)4Q9}z0GBZny&sbS+}V7;Uj(AfM2hq%LS=-;}gx@&vBB@ sg=ave6>}GHl8!H5hao!KexbL=lk?szdD{7Au6^+&Hy_vQ&SBht0L3$&{r~^~ literal 0 HcmV?d00001 diff --git a/public/views/amazon.html b/public/views/amazon.html new file mode 100644 index 000000000..d8ba2f0d9 --- /dev/null +++ b/public/views/amazon.html @@ -0,0 +1,75 @@ + +

+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ {{amazon.loading}} +
+
+ +
+ +
+ Amazon Gift Card +
+ +
+ No gift card in your wallet. Buy one now! +
+ +
+

Cards

+
+
+ {{id}} +
+
+ {{item.cardInfo.value.amount | currency : item.cardInfo.value.currencyCode + ' ' : 2}} +
+
+ Error + {{item.date * 1000 | amCalendar}} +
+
+ +
+
+
+ +
+ +
+
diff --git a/public/views/buyAmazon.html b/public/views/buyAmazon.html new file mode 100644 index 000000000..57dfd0323 --- /dev/null +++ b/public/views/buyAmazon.html @@ -0,0 +1,119 @@ +
+
+ + +
+ +
+
+
+
+
+
+
+
+
+ {{buy.loading}} +
+
+ +
+
+ +
+ + {{buy.error}} + +
+ +
+ Amazon Gift Card +
Redeem online
+
+
+ +
+ - + ${{fiat}} + + +
+ +
+ +
+ + + + +
+
+ +
+ Use your Amazon.com Gift Card to shop from a huge selection of books, electronics, music, movies, software, apparel, toys, and more. +
+ +
+ +
+
+
+
+ +
+
+

Gift card ready to redeem!

+ +
+ + {{buy.giftCard.cardInfo.value.amount | currency : buy.giftCard.cardInfo.value.currencyCode + ' ' : 2 }} + +
+ +
+
Claim code
+
{{buy.giftCard.gcClaimCode}}
+
+ +
+ +
+ +
+ To redeem your gift card, follow these steps: +
    +
  1. Visit www.amazon.com/gc.
  2. +
  3. Click Apply to Account and enter the claim code when prompted.
  4. +
  5. Gift card funds will be applied automatically to eligible orders during the checkout process.
  6. +
  7. You must pay for any remaining balance on your order with another payment method.
  8. +
+
+ +
+
BitPay invoice
+
{{buy.giftCard.bitpayInvoiceId}}
+ +
+
+
+ +
+
diff --git a/public/views/includes/sidebar.html b/public/views/includes/sidebar.html index 4b67781da..98e5db930 100644 --- a/public/views/includes/sidebar.html +++ b/public/views/includes/sidebar.html @@ -30,6 +30,13 @@ Buy and Sell +
  • + + +
    + Gift Card +
    +
  • diff --git a/public/views/modals/amazon-card-details.html b/public/views/modals/amazon-card-details.html new file mode 100644 index 000000000..4bb94b945 --- /dev/null +++ b/public/views/modals/amazon-card-details.html @@ -0,0 +1,45 @@ + + + diff --git a/src/js/controllers/amazon.js b/src/js/controllers/amazon.js new file mode 100644 index 000000000..0149c11aa --- /dev/null +++ b/src/js/controllers/amazon.js @@ -0,0 +1,53 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('amazonController', + function($rootScope, $scope, $timeout, $modal, profileService, configService, storageService, amazonService, isChromeApp, animationService, lodash, nodeWebkit) { + + window.ignoreMobilePause = true; + + this.init = function() { + var self = this; + var network = configService.getSync().amazon.testnet ? 'testnet' : 'livenet'; + amazonService.setCredentials(network); + amazonService.getGiftCards(function(err, gcds) { + if (err) { + self.error = err; + return; + } + self.giftCards = gcds; + + }); + }; + + this.openCardModal = function(card) { + $rootScope.modalOpened = true; + var self = this; + var fc = profileService.focusedClient; + var ModalInstanceCtrl = function($scope, $modalInstance) { + $scope.card = card; + + $scope.cancel = lodash.debounce(function() { + $modalInstance.dismiss('cancel'); + }, 0, 1000); + + }; + + var modalInstance = $modal.open({ + templateUrl: 'views/modals/amazon-card-details.html', + windowClass: animationService.modalAnimated.slideRight, + controller: ModalInstanceCtrl, + }); + + var disableCloseModal = $rootScope.$on('closeModal', function() { + modalInstance.dismiss('cancel'); + }); + + modalInstance.result.finally(function() { + $rootScope.modalOpened = false; + disableCloseModal(); + var m = angular.element(document.getElementsByClassName('reveal-modal')); + m.addClass(animationService.modalAnimated.slideOutRight); + }); + }; + + }); diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js new file mode 100644 index 000000000..6d49eb5d1 --- /dev/null +++ b/src/js/controllers/buyAmazon.js @@ -0,0 +1,239 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('buyAmazonController', + function($rootScope, $scope, $modal, $log, $timeout, lodash, profileService, animationService, bwsError, configService, walletService, fingerprintService, amazonService) { + + window.ignoreMobilePause = true; + var self = this; + var fc; + var minimumAmount = 1; + var stepAmount = 1; + var multiplierAmount = 2; + var maximumAmount = 10; + + var otherWallets = function(network) { + return lodash.filter(profileService.getWallets(network), function(w) { + return w.network == network && w.m == 1; + }); + }; + + var handleEncryptedWallet = function(client, cb) { + if (!walletService.isEncrypted(client)) return cb(); + $rootScope.$emit('Local/NeedsPassword', false, function(err, password) { + if (err) return cb(err); + return cb(walletService.unlock(client, password)); + }); + }; + + this.init = function() { + $scope.fiat = minimumAmount * multiplierAmount; + var network = configService.getSync().amazon.testnet ? 'testnet' : 'livenet'; + amazonService.setCredentials(network); + self.otherWallets = otherWallets(network); + // Choose focused wallet + try { + var currentWalletId = profileService.focusedClient.credentials.walletId; + lodash.find(self.otherWallets, function(w) { + if (w.id == currentWalletId) { + $timeout(function() { + self.selectedWalletId = w.id; + self.selectedWalletName = w.name; + fc = profileService.getClient(w.id); + $scope.$apply(); + }, 100); + } + }); + } catch (e) { + $log.debug(e); + }; + }; + + $scope.openWalletsModal = function(wallets) { + self.error = null; + var ModalInstanceCtrl = function($scope, $modalInstance) { + $scope.type = 'SELL'; + $scope.wallets = wallets; + $scope.noColor = true; + $scope.cancel = function() { + $modalInstance.dismiss('cancel'); + }; + + $scope.selectWallet = function(walletId, walletName) { + if (!profileService.getClient(walletId).isComplete()) { + self.error = bwsError.msg('WALLET_NOT_COMPLETE'); + $modalInstance.dismiss('cancel'); + return; + } + $modalInstance.close({ + 'walletId': walletId, + 'walletName': walletName, + }); + }; + }; + + var modalInstance = $modal.open({ + templateUrl: 'views/modals/wallets.html', + windowClass: animationService.modalAnimated.slideUp, + controller: ModalInstanceCtrl, + }); + + modalInstance.result.finally(function() { + var m = angular.element(document.getElementsByClassName('reveal-modal')); + m.addClass(animationService.modalAnimated.slideOutDown); + }); + + modalInstance.result.then(function(obj) { + $timeout(function() { + self.selectedWalletId = obj.walletId; + self.selectedWalletName = obj.walletName; + fc = profileService.getClient(obj.walletId); + $scope.$apply(); + }, 100); + }); + }; + + this.setAmount = function(plus) { + if (plus && $scope.fiat < maximumAmount ) { + stepAmount = stepAmount + 1; + $scope.fiat = stepAmount * multiplierAmount; + } else if (!plus && $scope.fiat > minimumAmount * multiplierAmount) { + stepAmount = stepAmount - 1; + $scope.fiat = stepAmount * multiplierAmount; + } + }; + + this.createTx = function() { + self.error = null; + + var dataSrc = { + price: $scope.fiat, + currency: 'USD' + }; + var outputs = []; + var config = configService.getSync(); + var configWallet = config.wallet; + var walletSettings = configWallet.settings; + + + self.loading = 'Creating invoice...'; + $timeout(function() { + + amazonService.createBitPayInvoice(dataSrc, function(err, data) { + if (err) { + self.loading = null; + self.error = err; + return; + } + + var address, comment, amount; + + address = data.data.bitcoinAddress; + amount = parseInt((data.data.btcPrice * 100000000).toFixed(0)); + comment = 'Buy Amazon Gift Card'; + + outputs.push({ + 'toAddress': address, + 'amount': amount, + 'message': comment + }); + + var txp = { + toAddress: address, + amount: amount, + outputs: outputs, + message: comment, + payProUrl: null, + excludeUnconfirmedUtxos: configWallet.spendUnconfirmed ? false : true, + feeLevel: walletSettings.feeLevel || 'normal' + }; + + self.loading = 'Creating transaction...'; + walletService.createTx(fc, txp, function(err, createdTxp) { + self.loading = null; + if (err) { + self.loading = null; + $log.debug(err); + self.error = bwsError.msg(err); + $scope.$apply(); + return; + } + $scope.$emit('Local/NeedsConfirmation', createdTxp, function(accept) { + if (accept) { + self.loading = 'Sending bitcoin...'; + self.confirmTx(createdTxp, function(err, tx) { + if (err) { + self.loading = null; + self.error = err; + return; + } + var gift = { + amount: dataSrc.price, + currencyCode: dataSrc.currency, + bitpayInvoiceId: data.data.id + }; + self.loading = 'Buying gift card...'; + amazonService.buyGiftCard(gift, function(err, giftCard) { + self.loading = null; + if (err) { + self.error = err; + return; + } + self.giftCard = giftCard; + }); + }); + } + }); + }); + }); + }, 100); + }; + + this.confirmTx = function(txp, cb) { + + fingerprintService.check(fc, function(err) { + if (err) { + $log.debug(err); + return cb(err); + } + + handleEncryptedWallet(fc, function(err) { + if (err) { + $log.debug(err); + return bwsError.cb(err, null, cb); + } + + walletService.publishTx(fc, txp, function(err, publishedTxp) { + if (err) { + $log.debug(err); + return bwsError.cb(err, null, cb); + } + + walletService.signTx(fc, publishedTxp, function(err, signedTxp) { + walletService.lock(fc); + if (err) { + $log.debug(err); + walletService.removeTx(fc, signedTxp, function(err) { + if (err) $log.debug(err); + }); + return bwsError.cb(err, null, cb); + } + + walletService.broadcastTx(fc, signedTxp, function(err, broadcastedTxp) { + if (err) { + $log.debug(err); + walletService.removeTx(fc, broadcastedTxp, function(err) { + if (err) $log.debug(err); + }); + return bwsError.cb(err, null, cb); + } + $timeout(function() { + return cb(null, broadcastedTxp); + }, 5000); + }); + }); + }); + }); + }); + }; + + }); diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index 72de95860..a8bf7b0b1 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -160,6 +160,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.initGlidera(); self.initCoinbase(); + self.initAmazon(); self.hideBalance(); @@ -1040,6 +1041,10 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); }; + self.initAmazon = function() { + self.amazonEnabled = configService.getSync().amazon.enabled; + }; + self.initGlidera = function(accessToken) { self.glideraEnabled = configService.getSync().glidera.enabled; self.glideraTestnet = configService.getSync().glidera.testnet; diff --git a/src/js/routes.js b/src/js/routes.js index c2e97747f..61db44513 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -315,6 +315,26 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }, } }) + .state('amazon', { + url: '/amazon', + walletShouldBeComplete: true, + needProfile: true, + views: { + 'main': { + templateUrl: 'views/amazon.html' + }, + } + }) + .state('buyAmazon', { + url: '/buyamazon', + walletShouldBeComplete: true, + needProfile: true, + views: { + 'main': { + templateUrl: 'views/buyAmazon.html' + }, + } + }) .state('preferencesAdvanced', { url: '/preferencesAdvanced', templateUrl: 'views/preferencesAdvanced.html', diff --git a/src/js/services/amazonService.js b/src/js/services/amazonService.js new file mode 100644 index 000000000..c7dc3ef6f --- /dev/null +++ b/src/js/services/amazonService.js @@ -0,0 +1,123 @@ +'use strict'; + +angular.module('copayApp.services').factory('amazonService', function($http, $log, isCordova, lodash, storageService, configService) { + var root = {}; + var credentials = {}; + + var fakeData = { + "cardInfo": { + "cardNumber":null, + "cardStatus":"RefundedToPurchaser", + "expirationDate":null, + "value":{ + "amount":1.0, + "currencyCode":"USD" + } + }, + "creationRequestId":"AwssbTSpecTest001", + "gcClaimCode":"Z7NV-LBBG39-75MU", + "gcExpirationDate":null, + "gcId":"A2GCN9BRX5QS76", + "status":"SUCCESS", + "bitpayInvoiceId":"NJtevvEponHbQVmYoL7FYp" + }; + + root.setCredentials = function(network) { + + if (network == 'testnet') { + credentials.BITPAY_API = 'https://test.bitpay.com'; + credentials.BITPAY_API_TOKEN = 'GDtYwBqbMZvjz5JrYZ1d2ba96StV92U4Yg4AGhT3C4He'; + credentials.AMAZON_HOST = 'https://agcod-v2-gamma.amazon.com'; + } + else { + credentials.BITPAY_API = 'https://bitpay.com'; + credentials.BITPAY_API_TOKEN = window.bitpay_token; + credentials.AMAZON_HOST = 'https://agcod-v2.amazon.com'; + }; + }; + + var _getBitPay = function(endpoint, token) { + return { + method: 'GET', + url: credentials.BITPAY_API + endpoint, + headers: { + 'content-type': 'application/json' + } + }; + }; + + var _postBitPay = function(endpoint, data) { + data.token = credentials.BITPAY_API_TOKEN; + return { + method: 'POST', + url: credentials.BITPAY_API + endpoint, + headers: { + 'content-type': 'application/json' + }, + data: data + }; + }; + + root.createBitPayInvoice = function(data, cb) { + var data = { + price: data.price, + currency: data.currency + }; + $http(_postBitPay('/invoices', data)).then(function(data) { + $log.info('BitPay Create Invoice: SUCCESS'); + return cb(null, data.data); + }, function(data) { + $log.error('BitPay Create Invoice: ERROR ' + data.statusText); + return cb(data); + }); + }; + + root.saveGiftCard = function(gc, opts, cb) { + var network = configService.getSync().amazon.testnet ? 'testnet' : 'livenet'; + storageService.getAmazonGiftCards(network, function(err, oldGiftCards) { + if (lodash.isString(oldGiftCards)) { + oldGiftCards = JSON.parse(oldGiftCards); + } + if (lodash.isString(gc)) { + gc = JSON.parse(gc); + } + var inv = oldGiftCards || {}; + inv[gc.gcId] = gc; + if (opts && (opts.error || opts.status)) { + inv[gc.gcId] = lodash.assign(inv[gc.gcId], opts); + } + if (opts && opts.remove) { + delete(inv[gc.gcId]); + } + inv = JSON.stringify(inv); + + storageService.setAmazonGiftCards(network, inv, function(err) { + return cb(err); + }); + }); + }; + + root.getGiftCards = function(cb) { + var network = configService.getSync().amazon.testnet ? 'testnet' : 'livenet'; + storageService.getAmazonGiftCards(network, function(err, giftCards) { + var _gcds = giftCards ? JSON.parse(giftCards) : null; + return cb(err, _gcds); + }); + }; + + root.buyGiftCard = function(gift, cb) { + var newId = Math.floor(Date.now() / 1000); + var saveData = fakeData; + saveData.gcId = saveData.gcId + '' + newId; + saveData.cardInfo.value.amount = gift.amount; + saveData.cardInfo.value.currencyCode = gift.currencyCode; + saveData['bitpayInvoiceId'] = gift.bitpayInvoiceId; + saveData['date'] = newId; + root.saveGiftCard(saveData, null, function(err) { + return cb(null, fakeData); + }); + }; + + return root; + +}); diff --git a/src/js/services/configService.js b/src/js/services/configService.js index a552b58fe..c956d2945 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -43,6 +43,11 @@ angular.module('copayApp.services').factory('configService', function(storageSer testnet: false }, + amazon: { + enabled: true, + testnet: false + }, + rates: { url: 'https://insight.bitpay.com:443/api/rates', }, @@ -101,6 +106,9 @@ angular.module('copayApp.services').factory('configService', function(storageSer if (!configCache.coinbase) { configCache.coinbase = defaultConfig.coinbase; } + if (!configCache.amazon) { + configCache.amazon = defaultConfig.amazon; + } if (!configCache.pushNotifications) { configCache.pushNotifications = defaultConfig.pushNotifications; } @@ -117,6 +125,10 @@ angular.module('copayApp.services').factory('configService', function(storageSer // Disabled for testnet configCache.coinbase.testnet = false; + // Amazon + // Disabled for testnet + configCache.amazon.testnet = true; + $log.debug('Preferences read:', configCache) return cb(err, configCache); }); diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 33eaa819c..2f67fd282 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -317,6 +317,18 @@ angular.module('copayApp.services') }); }); }; + + root.setAmazonGiftCards = function(network, gcs, cb) { + storage.set('amazonGiftCards-' + network, gcs, cb); + }; + + root.getAmazonGiftCards = function(network, cb) { + storage.get('amazonGiftCards-' + network, cb); + }; + + root.removeAmazonGiftCards = function(network, cb) { + storage.remove('amazonGiftCards-' + network, cb); + }; return root; }); diff --git a/src/sass/amazon.scss b/src/sass/amazon.scss new file mode 100644 index 000000000..bcbae297c --- /dev/null +++ b/src/sass/amazon.scss @@ -0,0 +1,22 @@ + +.amazon-select-amount { + display: inline-block; + padding: 3px 15px; + background-color: #4B6178; + color: #ffffff; + border-radius: 5px; + margin: 0 5px; + &:hover { + color: #ffffff; + } +} + +.amazon-amount { + display: inline-block; + background-color: #E4E8EC; + padding: 3px 10px; + width: 60px; + text-align: center; + border: 1px solid #ccc; + border-radius: 5px; +} diff --git a/src/sass/main.scss b/src/sass/main.scss index 985a219c3..02bcdbd34 100644 --- a/src/sass/main.scss +++ b/src/sass/main.scss @@ -99,7 +99,7 @@ h4.title a { } } -.modal-content h4, .glidera h4, .coinbase h4 { +.modal-content h4, .glidera h4, .coinbase h4, .amazon h4 { background: #F6F7F9; padding: 25px 0px 5px 10px; text-transform: uppercase; From 05e57983c66fbcc2a223a9f4cd71fbefc3cb196f Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 16 May 2016 17:51:26 -0300 Subject: [PATCH 02/51] Improves datetime. Adds invoice URL --- public/views/amazon.html | 2 +- public/views/buyAmazon.html | 2 +- public/views/modals/amazon-card-details.html | 12 +++++++++--- src/js/controllers/buyAmazon.js | 3 ++- src/js/services/amazonService.js | 20 ++++++++++++++++---- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/public/views/amazon.html b/public/views/amazon.html index d8ba2f0d9..5f14bd234 100644 --- a/public/views/amazon.html +++ b/public/views/amazon.html @@ -61,7 +61,7 @@
    Error - {{item.date * 1000 | amCalendar}} + {{item.date * 1000 | amTimeAgo}}
    diff --git a/public/views/buyAmazon.html b/public/views/buyAmazon.html index 57dfd0323..d049109ec 100644 --- a/public/views/buyAmazon.html +++ b/public/views/buyAmazon.html @@ -108,7 +108,7 @@
    BitPay invoice
    {{buy.giftCard.bitpayInvoiceId}}
    diff --git a/public/views/modals/amazon-card-details.html b/public/views/modals/amazon-card-details.html index 4bb94b945..ddf25724f 100644 --- a/public/views/modals/amazon-card-details.html +++ b/public/views/modals/amazon-card-details.html @@ -25,18 +25,24 @@
      -
    • +
    • + Claim code {{card.gcClaimCode}}
    • +
    • + Created at + {{card.date * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}} +
    • Status Completed Pending Error
    • -
    • - BitPay Invoice ID +
    • + + BitPay Invoice {{card.bitpayInvoiceId}}
    diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index 6d49eb5d1..4735eb94c 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -169,7 +169,8 @@ angular.module('copayApp.controllers').controller('buyAmazonController', var gift = { amount: dataSrc.price, currencyCode: dataSrc.currency, - bitpayInvoiceId: data.data.id + bitpayInvoiceId: data.data.id, + bitpayInvoiceUrl: data.data.url }; self.loading = 'Buying gift card...'; amazonService.buyGiftCard(gift, function(err, giftCard) { diff --git a/src/js/services/amazonService.js b/src/js/services/amazonService.js index c7dc3ef6f..ff6435e54 100644 --- a/src/js/services/amazonService.js +++ b/src/js/services/amazonService.js @@ -19,7 +19,8 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo "gcExpirationDate":null, "gcId":"A2GCN9BRX5QS76", "status":"SUCCESS", - "bitpayInvoiceId":"NJtevvEponHbQVmYoL7FYp" + "bitpayInvoiceId":"NJtevvEponHbQVmYoL7FYp", + "bitpayInvoiceUrl":"http://test.bitpay.com/invoice?id=XwrLryQEypTKg4nq37t3bN" }; root.setCredentials = function(network) { @@ -36,7 +37,7 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo }; }; - var _getBitPay = function(endpoint, token) { + var _getBitPay = function(endpoint) { return { method: 'GET', url: credentials.BITPAY_API + endpoint, @@ -67,8 +68,18 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo $log.info('BitPay Create Invoice: SUCCESS'); return cb(null, data.data); }, function(data) { - $log.error('BitPay Create Invoice: ERROR ' + data.statusText); - return cb(data); + $log.error('BitPay Create Invoice: ERROR ' + data.data.error); + return cb(data.data.error); + }); + }; + + root.getBitPayInvoice = function(id, cb) { + $http(_getBitPay('/invoices/' + id)).then(function(data) { + $log.info('BitPay Get Invoice: SUCCESS'); + return cb(null, data.data); + }, function(data) { + $log.error('BitPay Get Invoice: ERROR ' + data.data.error); + return cb(data.data.error); }); }; @@ -112,6 +123,7 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo saveData.cardInfo.value.amount = gift.amount; saveData.cardInfo.value.currencyCode = gift.currencyCode; saveData['bitpayInvoiceId'] = gift.bitpayInvoiceId; + saveData['bitpayInvoiceUrl'] = gift.bitpayInvoiceUrl; saveData['date'] = newId; root.saveGiftCard(saveData, null, function(err) { return cb(null, fakeData); From 6b2fbeae01b6b0d331147ded182d1914cedfb08a Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 19 May 2016 01:18:15 -0300 Subject: [PATCH 03/51] Real creation of gift card --- .gitignore | 4 + Gruntfile.js | 7 +- public/views/amazon.html | 2 +- src/js/controllers/buyAmazon.js | 9 +- src/js/services/amazonService.js | 148 +++++++++++++++++++++++-------- src/sass/main.scss | 6 +- util/amazon.js | 34 +++++++ 7 files changed, 164 insertions(+), 46 deletions(-) create mode 100755 util/amazon.js diff --git a/.gitignore b/.gitignore index 4a30d65d8..eeedbc84b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,10 @@ src/js/translations.js coinbase.json src/js/coinbase.js +# Amazon.com API credentials +amazon.json +src/js/amazon.js + # version src/js/version.js diff --git a/Gruntfile.js b/Gruntfile.js index 3fd51b784..f43f545f5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -34,6 +34,9 @@ module.exports = function(grunt) { coinbase: { command: 'node ./util/coinbase.js' }, + amazon: { + command: 'node ./util/amazon.js' + }, clear: { command: 'rm -Rf bower_components node_modules' }, @@ -105,6 +108,7 @@ module.exports = function(grunt) { 'bower_components/angular-sanitize/angular-sanitize.js', 'bower_components/ng-csv/build/ng-csv.js', 'bower_components/angular-mocks/angular-mocks.js', + 'bower_components/crypto-js/crypto-js.js', 'angular-bitcore-wallet-client/angular-bitcore-wallet-client.js' ], dest: 'public/lib/angular.js' @@ -121,6 +125,7 @@ module.exports = function(grunt) { 'src/js/translations.js', 'src/js/version.js', 'src/js/coinbase.js', + 'src/js/amazon.js', 'src/js/init.js', 'src/js/trezor-url.js', 'bower_components/trezor-connect/login.js' @@ -266,7 +271,7 @@ module.exports = function(grunt) { } }); - grunt.registerTask('default', ['nggettext_compile', 'exec:version', 'exec:coinbase', 'browserify', 'sass', 'concat', 'copy:icons', 'copy:ionic_fonts']); + grunt.registerTask('default', ['nggettext_compile', 'exec:version', 'exec:coinbase', 'exec:amazon', 'browserify', 'sass', 'concat', 'copy:icons', 'copy:ionic_fonts']); grunt.registerTask('prod', ['default', 'uglify']); grunt.registerTask('translate', ['nggettext_extract']); grunt.registerTask('test', ['karma:unit']); diff --git a/public/views/amazon.html b/public/views/amazon.html index 5f14bd234..cd57f6ff9 100644 --- a/public/views/amazon.html +++ b/public/views/amazon.html @@ -17,7 +17,7 @@

    - Amazon Gift Card + Amazon.com Gift Card

    diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index 4735eb94c..a4e2da7b8 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -105,9 +105,10 @@ angular.module('copayApp.controllers').controller('buyAmazonController', this.createTx = function() { self.error = null; + var currency_code = configService.getSync().amazon.testnet ? window.amazon_sandbox_currency_code : window.amazon_currency_code; var dataSrc = { price: $scope.fiat, - currency: 'USD' + currency: currency_code }; var outputs = []; var config = configService.getSync(); @@ -129,7 +130,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', address = data.data.bitcoinAddress; amount = parseInt((data.data.btcPrice * 100000000).toFixed(0)); - comment = 'Buy Amazon Gift Card'; + comment = 'Amazon.com Gift Card'; outputs.push({ 'toAddress': address, @@ -172,8 +173,8 @@ angular.module('copayApp.controllers').controller('buyAmazonController', bitpayInvoiceId: data.data.id, bitpayInvoiceUrl: data.data.url }; - self.loading = 'Buying gift card...'; - amazonService.buyGiftCard(gift, function(err, giftCard) { + self.loading = 'Creating gift card...'; + amazonService.createGiftCard(gift, function(err, giftCard) { self.loading = null; if (err) { self.error = err; diff --git a/src/js/services/amazonService.js b/src/js/services/amazonService.js index ff6435e54..b32411a49 100644 --- a/src/js/services/amazonService.js +++ b/src/js/services/amazonService.js @@ -1,46 +1,52 @@ 'use strict'; -angular.module('copayApp.services').factory('amazonService', function($http, $log, isCordova, lodash, storageService, configService) { +angular.module('copayApp.services').factory('amazonService', function($http, $log, isCordova, lodash, moment, storageService, configService) { var root = {}; var credentials = {}; - var fakeData = { - "cardInfo": { - "cardNumber":null, - "cardStatus":"RefundedToPurchaser", - "expirationDate":null, - "value":{ - "amount":1.0, - "currencyCode":"USD" - } - }, - "creationRequestId":"AwssbTSpecTest001", - "gcClaimCode":"Z7NV-LBBG39-75MU", - "gcExpirationDate":null, - "gcId":"A2GCN9BRX5QS76", - "status":"SUCCESS", - "bitpayInvoiceId":"NJtevvEponHbQVmYoL7FYp", - "bitpayInvoiceUrl":"http://test.bitpay.com/invoice?id=XwrLryQEypTKg4nq37t3bN" - }; - root.setCredentials = function(network) { + credentials.AMAZON_SANDBOX = network == 'testnet' ? true : false; + credentials.AMAZON_SERVICE_NAME = 'AGCODService'; if (network == 'testnet') { - credentials.BITPAY_API = 'https://test.bitpay.com'; - credentials.BITPAY_API_TOKEN = 'GDtYwBqbMZvjz5JrYZ1d2ba96StV92U4Yg4AGhT3C4He'; - credentials.AMAZON_HOST = 'https://agcod-v2-gamma.amazon.com'; + credentials.BITPAY_API_URL = window.amazon_sandbox_bitpay_api_url; + credentials.BITPAY_API_TOKEN = window.amazon_sandbox_bitpay_api_token; + credentials.AMAZON_ACCESS_KEY = window.amazon_sandbox_access_key; + credentials.AMAZON_SECRET_KEY = window.amazon_sandbox_secret_key; + credentials.AMAZON_PARTNER_ID = window.amazon_sandbox_partner_id; + credentials.AMAZON_REGION = window.amazon_sandbox_region; + credentials.AMAZON_ENDPOINT = window.amazon_sandbox_endpoint; } else { - credentials.BITPAY_API = 'https://bitpay.com'; - credentials.BITPAY_API_TOKEN = window.bitpay_token; - credentials.AMAZON_HOST = 'https://agcod-v2.amazon.com'; + credentials.BITPAY_API_URL = window.amazon_bitpay_api_url; + credentials.BITPAY_API_TOKEN = window.amazon_bitpay_api_token; + credentials.AMAZON_ACCESS_KEY = window.amazon_access_key; + credentials.AMAZON_SECRET_KEY = window.amazon_secret_key; + credentials.AMAZON_PARTNER_ID = window.amazon_partner_id; + credentials.AMAZON_REGION = window.amazon_region; + credentials.AMAZON_ENDPOINT = window.amazon_endpoint; }; }; + var _getSignatureKey = function() { + + var key = credentials.AMAZON_SECRET_KEY; + var dateStamp = moment.utc().format('YYYYMMDD'); + var regionName = credentials.AMAZON_REGION; + var serviceName = credentials.AMAZON_SERVICE_NAME; + + var kDate= CryptoJS.HmacSHA256(dateStamp, "AWS4" + key, { asBytes: true}); + var kRegion= CryptoJS.HmacSHA256(regionName, kDate, { asBytes: true }); + var kService=CryptoJS.HmacSHA256(serviceName, kRegion, { asBytes: true }); + var kSigning= CryptoJS.HmacSHA256("aws4_request", kService, { asBytes: true }); + + return kSigning; + } + var _getBitPay = function(endpoint) { return { method: 'GET', - url: credentials.BITPAY_API + endpoint, + url: credentials.BITPAY_API_URL + endpoint, headers: { 'content-type': 'application/json' } @@ -51,7 +57,7 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo data.token = credentials.BITPAY_API_TOKEN; return { method: 'POST', - url: credentials.BITPAY_API + endpoint, + url: credentials.BITPAY_API_URL + endpoint, headers: { 'content-type': 'application/json' }, @@ -116,17 +122,81 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo }); }; - root.buyGiftCard = function(gift, cb) { - var newId = Math.floor(Date.now() / 1000); - var saveData = fakeData; - saveData.gcId = saveData.gcId + '' + newId; - saveData.cardInfo.value.amount = gift.amount; - saveData.cardInfo.value.currencyCode = gift.currencyCode; - saveData['bitpayInvoiceId'] = gift.bitpayInvoiceId; - saveData['bitpayInvoiceUrl'] = gift.bitpayInvoiceUrl; - saveData['date'] = newId; - root.saveGiftCard(saveData, null, function(err) { - return cb(null, fakeData); + root.createGiftCard = function(dataSrc, cb) { + var sandbox = credentials.AMAZON_SANDBOX ? 'T' : 'P'; // T: test - P: production + var now = moment().unix(); + var requestId = credentials.AMAZON_PARTNER_ID + sandbox + now; + + var data = { + 'creationRequestId': requestId, + 'partnerId': credentials.AMAZON_PARTNER_ID, + 'value': { + 'currencyCode': dataSrc.currencyCode, + 'amount': dataSrc.amount + } + }; + + var content_type = 'application/json'; + var accept = 'application/json'; + var amz_date = moment.utc().format('YYYYMMDD[T]HHmmss[Z]'); + var date_stamp = moment.utc().format('YYYYMMDD'); + var amz_target = 'com.amazonaws.agcod.AGCODService.CreateGiftCard'; + var canonical_querystring = ''; + + /************* TASK 1: CREATE A CANONICAL REQUEST *************/ + + var canonical_headers = + 'accept:' + accept + '\n' + + 'content-type:' + content_type + '\n' + + 'host:' + credentials.AMAZON_ENDPOINT.replace('https://', '') + '\n' + + 'x-amz-date:' + amz_date + '\n' + + 'x-amz-target:' + amz_target + '\n'; + + var signed_headers = 'accept;content-type;host;x-amz-date;x-amz-target'; + data = JSON.stringify(data); + var payload_hash = CryptoJS.SHA256(data).toString(CryptoJS.enc.Hex); + var canonical_request = 'POST' + '\n' + '/CreateGiftCard' + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash; + + /************* TASK 2: CREATE THE STRING TO SIGN *************/ + + var algorithm = 'AWS4-HMAC-SHA256'; + var credential_scope = date_stamp + '/' + credentials.AMAZON_REGION + '/' + credentials.AMAZON_SERVICE_NAME + '/' + 'aws4_request'; + var hashed_canonical_request = CryptoJS.SHA256(canonical_request).toString(CryptoJS.enc.Hex); + var string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashed_canonical_request; + + /************* TASK 3: CALCULATE THE SIGNATURE *************/ + + var signing_key = _getSignatureKey(); + var signature = CryptoJS.HmacSHA256(string_to_sign, signing_key).toString(CryptoJS.enc.Hex) + var authorization_header = algorithm + ' ' + 'Credential=' + credentials.AMAZON_ACCESS_KEY + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature; + + /************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST *************/ + + var headers = { + 'Content-Type': content_type, + 'Accept': accept, + 'X-Amz-Date': amz_date, + 'X-Amz-Target': amz_target, + 'Authorization': authorization_header + }; + + $http({ + 'method': 'POST', + 'url': credentials.AMAZON_ENDPOINT + '/CreateGiftCard', + 'data': data, + 'headers': headers + }).then(function(data) { + $log.info('Amazon Create Gift Card: SUCCESS'); + var newData = data.data; + newData['bitpayInvoiceId'] = dataSrc.bitpayInvoiceId; + newData['bitpayInvoiceUrl'] = dataSrc.bitpayInvoiceUrl; + newData['date'] = now; + root.saveGiftCard(newData, null, function(err) { + return cb(null, newData); + }); + }, function(data) { + $log.error('Amazon Create Gift Card: ERROR ' + data.statusText); + return cb(data.statusText); }); }; diff --git a/src/sass/main.scss b/src/sass/main.scss index 02bcdbd34..73be3a3fb 100644 --- a/src/sass/main.scss +++ b/src/sass/main.scss @@ -536,6 +536,10 @@ ul.manage li { font-size: 24px; } +.size-28 { + font-size: 28px; +} + .size-36 { font-size: 36px; } @@ -1655,7 +1659,7 @@ a.missing-copayers { .sidebar { background: #2C3E50; .icon { - width: 39px; + width: 35px; text-align: center; margin-right: 15px; float: left; diff --git a/util/amazon.js b/util/amazon.js new file mode 100755 index 000000000..be6a1e008 --- /dev/null +++ b/util/amazon.js @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +'use strict'; + +var fs = require('fs'); +var file; + +try { + file = fs.readFileSync('./amazon.json', 'utf8'); +} catch(err) { + return; +} + +var json = JSON.parse(file); +console.log('Amazon Partner ID: ' + json.production.partner_id); + +var content = 'window.amazon_sandbox_access_key="' + json.sandbox.access_key + '";'; +content = content + '\nwindow.amazon_sandbox_secret_key="' + json.sandbox.secret_key + '";'; +content = content + '\nwindow.amazon_sandbox_partner_id="' + json.sandbox.partner_id + '";'; +content = content + '\nwindow.amazon_sandbox_currency_code="' + json.sandbox.currency_code + '";'; +content = content + '\nwindow.amazon_sandbox_region="' + json.sandbox.region + '";'; +content = content + '\nwindow.amazon_sandbox_endpoint="' + json.sandbox.endpoint + '";'; +content = content + '\nwindow.amazon_sandbox_bitpay_api_token="' + json.sandbox.bitpay_api_token + '";'; +content = content + '\nwindow.amazon_sandbox_bitpay_api_url="' + json.sandbox.bitpay_api_url + '";'; +content = content + '\nwindow.amazon_access_key="' + json.production.access_key + '";'; +content = content + '\nwindow.amazon_secret_key="' + json.production.secret_key + '";'; +content = content + '\nwindow.amazon_partner_id="' + json.production.partner_id + '";'; +content = content + '\nwindow.amazon_currency_code="' + json.production.currency_code + '";'; +content = content + '\nwindow.amazon_region="' + json.production.region + '";'; +content = content + '\nwindow.amazon_endpoint="' + json.production.endpoint + '";'; +content = content + '\nwindow.amazon_bitpay_api_token="' + json.production.bitpay_api_token + '";'; +content = content + '\nwindow.amazon_bitpay_api_url="' + json.production.bitpay_api_url + '";'; +fs.writeFileSync("./src/js/amazon.js", content); + From b0d24c68144b7833b98b9ef1f91356fc2dcae5ef Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 19 May 2016 17:29:24 -0300 Subject: [PATCH 04/51] Handle errors. Cancel gift card --- public/views/amazon.html | 7 +- public/views/buyAmazon.html | 33 ++++- public/views/modals/amazon-card-details.html | 71 ++++++++-- src/js/controllers/amazon.js | 56 +++++++- src/js/controllers/buyAmazon.js | 5 +- src/js/services/amazonService.js | 131 ++++++++++++------- 6 files changed, 239 insertions(+), 64 deletions(-) diff --git a/public/views/amazon.html b/public/views/amazon.html index cd57f6ff9..0b62b612d 100644 --- a/public/views/amazon.html +++ b/public/views/amazon.html @@ -40,7 +40,7 @@
    -
    +
    Amazon Gift Card
    @@ -60,8 +60,9 @@ {{item.cardInfo.value.amount | currency : item.cardInfo.value.currencyCode + ' ' : 2}}
    - Error - {{item.date * 1000 | amTimeAgo}} + Error + Resend is required + {{item.date * 1000 | amTimeAgo}}
    diff --git a/public/views/buyAmazon.html b/public/views/buyAmazon.html index d049109ec..348587901 100644 --- a/public/views/buyAmazon.html +++ b/public/views/buyAmazon.html @@ -27,6 +27,17 @@ {{buy.error}} +
    + 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 +
    + Amount: {{buy.errorInfo.amount}} {{buy.errorInfo.currencyCode}}
    + BitPay Invoice ID: {{buy.errorInfo.bitpayInvoiceId}}. +
    + +
    @@ -73,7 +84,27 @@
    -
    +
    +

    Amazon.com Gift Card could not be created

    +
    + + There was an error when trying to create the Amazon.com Gift Card. Status: {{buy.giftCard.status}} + +
    +
    + + This is a temporary/recoverable system failure that can be + resolved retrying the request from your list of cards + + + This failure could not be recoverable. Request your refund from your list of cards + + +
    +
    +

    Gift card ready to redeem!

    diff --git a/public/views/modals/amazon-card-details.html b/public/views/modals/amazon-card-details.html index ddf25724f..b8ae6ae90 100644 --- a/public/views/modals/amazon-card-details.html +++ b/public/views/modals/amazon-card-details.html @@ -17,28 +17,55 @@ ng-swipe-right="cancel()">
    - Amazon + Amazon
    {{card.cardInfo.value.amount | currency : card.cardInfo.value.currencyCode + ' ' : 2}}
    +
    + + {{error}} + +
    + +
    +
    +
    + There was a temporary/recoverable system failure that can be resolved by retrying the request +
    + +
    +
    + There was a failure to the create gift card that could not be recoverable. Please, contact BitPay to refund your bitcoin +
    +
    +
      -
    • +
    • Claim code {{card.gcClaimCode}}
    • - Created at - {{card.date * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}} + Card status + Fulfilled + Refunded to purchaser + Expired
    • - Status - Completed - Pending - Error + Created at + {{card.date * 1000 | amDateFormat:'MM/DD/YYYY HH:mm a'}} +
    • +
    • + Creation status + Success + Resend is required + Error + Refunded
    • @@ -47,5 +74,33 @@
    +
    +
    +

    + This action will remove the gift card +

    + +
    +
    + +
    +
    +

    + This action will cancel the gift card +

    + +
    +
    +
    diff --git a/src/js/controllers/amazon.js b/src/js/controllers/amazon.js index 0149c11aa..df90a6373 100644 --- a/src/js/controllers/amazon.js +++ b/src/js/controllers/amazon.js @@ -15,7 +15,6 @@ angular.module('copayApp.controllers').controller('amazonController', return; } self.giftCards = gcds; - }); }; @@ -26,8 +25,55 @@ angular.module('copayApp.controllers').controller('amazonController', var ModalInstanceCtrl = function($scope, $modalInstance) { $scope.card = card; + $scope.cancelGiftCard = function() { + $scope.refresh = true; + var dataSrc = { + creationRequestId: $scope.card.creationRequestId, + gcId: $scope.card.gcId, + bitpayInvoiceId: $scope.card.bitpayInvoiceId, + bitpayInvoiceUrl: $scope.card.bitpayInvoiceUrl, + date: $scope.card.date + }; + $scope.loading = true; + amazonService.cancelGiftCard(dataSrc, function(err, data) { + $scope.loading = null; + if (err || data.status != 'SUCCESS') { + $scope.error = err || data.status; + return; + } + $scope.refreshGiftCard(); + }); + }; + + $scope.remove = function() { + amazonService.saveGiftCard($scope.card, {remove: true}, function(err) { + $modalInstance.close(true); + }); + }; + + $scope.refreshGiftCard = function() { + $scope.refresh = true; + var dataSrc = { + creationRequestId: $scope.card.creationRequestId, + amount: $scope.card.cardInfo.value.amount, + currencyCode: $scope.card.cardInfo.value.currencyCode, + bitpayInvoiceId: $scope.card.bitpayInvoiceId, + bitpayInvoiceUrl: $scope.card.bitpayInvoiceUrl, + date: $scope.card.date + }; + $scope.loading = true; + amazonService.createGiftCard(dataSrc, function(err, data) { + $scope.loading = null; + if (err) { + $scope.error = err; + return; + } + $scope.card = data; + }); + }; + $scope.cancel = lodash.debounce(function() { - $modalInstance.dismiss('cancel'); + $modalInstance.close($scope.refresh); }, 0, 1000); }; @@ -39,7 +85,7 @@ angular.module('copayApp.controllers').controller('amazonController', }); var disableCloseModal = $rootScope.$on('closeModal', function() { - modalInstance.dismiss('cancel'); + modalInstance.close($scope.refresh); }); modalInstance.result.finally(function() { @@ -48,6 +94,10 @@ angular.module('copayApp.controllers').controller('amazonController', var m = angular.element(document.getElementsByClassName('reveal-modal')); m.addClass(animationService.modalAnimated.slideOutRight); }); + + modalInstance.result.then(function(refresh) { + if (refresh) self.init(); + }, function() {}); }; }); diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index a4e2da7b8..074fe04af 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -45,11 +45,12 @@ angular.module('copayApp.controllers').controller('buyAmazonController', }); } catch (e) { $log.debug(e); - }; + }; }; $scope.openWalletsModal = function(wallets) { self.error = null; + self.errorInfo = null; var ModalInstanceCtrl = function($scope, $modalInstance) { $scope.type = 'SELL'; $scope.wallets = wallets; @@ -104,6 +105,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', this.createTx = function() { self.error = null; + self.errorInfo = null; var currency_code = configService.getSync().amazon.testnet ? window.amazon_sandbox_currency_code : window.amazon_currency_code; var dataSrc = { @@ -178,6 +180,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', self.loading = null; if (err) { self.error = err; + self.errorInfo = gift; return; } self.giftCard = giftCard; diff --git a/src/js/services/amazonService.js b/src/js/services/amazonService.js index b32411a49..d904a5ef8 100644 --- a/src/js/services/amazonService.js +++ b/src/js/services/amazonService.js @@ -43,6 +43,52 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo return kSigning; } + + var _getHeaders = function(data, method, endpoint, amz_target) { + var content_type = 'application/json'; + var accept = 'application/json'; + var amz_date = moment.utc().format('YYYYMMDD[T]HHmmss[Z]'); + var date_stamp = moment.utc().format('YYYYMMDD'); + var canonical_querystring = ''; + + /************* TASK 1: CREATE A CANONICAL REQUEST *************/ + + var canonical_headers = + 'accept:' + accept + '\n' + + 'content-type:' + content_type + '\n' + + 'host:' + credentials.AMAZON_ENDPOINT.replace('https://', '') + '\n' + + 'x-amz-date:' + amz_date + '\n' + + 'x-amz-target:' + amz_target + '\n'; + + var signed_headers = 'accept;content-type;host;x-amz-date;x-amz-target'; + data = JSON.stringify(data); + var payload_hash = CryptoJS.SHA256(data).toString(CryptoJS.enc.Hex); + var canonical_request = method + '\n' + endpoint + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash; + + /************* TASK 2: CREATE THE STRING TO SIGN *************/ + + var algorithm = 'AWS4-HMAC-SHA256'; + var credential_scope = date_stamp + '/' + credentials.AMAZON_REGION + '/' + credentials.AMAZON_SERVICE_NAME + '/' + 'aws4_request'; + var hashed_canonical_request = CryptoJS.SHA256(canonical_request).toString(CryptoJS.enc.Hex); + var string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashed_canonical_request; + + /************* TASK 3: CALCULATE THE SIGNATURE *************/ + + var signing_key = _getSignatureKey(); + var signature = CryptoJS.HmacSHA256(string_to_sign, signing_key).toString(CryptoJS.enc.Hex) + var authorization_header = algorithm + ' ' + 'Credential=' + credentials.AMAZON_ACCESS_KEY + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature; + + /************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST *************/ + + return { + 'Content-Type': content_type, + 'Accept': accept, + 'X-Amz-Date': amz_date, + 'X-Amz-Target': amz_target, + 'Authorization': authorization_header + }; + }; + var _getBitPay = function(endpoint) { return { method: 'GET', @@ -125,7 +171,7 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo root.createGiftCard = function(dataSrc, cb) { var sandbox = credentials.AMAZON_SANDBOX ? 'T' : 'P'; // T: test - P: production var now = moment().unix(); - var requestId = credentials.AMAZON_PARTNER_ID + sandbox + now; + var requestId = dataSrc.creationRequestId || credentials.AMAZON_PARTNER_ID + sandbox + now; var data = { 'creationRequestId': requestId, @@ -136,66 +182,55 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo } }; - var content_type = 'application/json'; - var accept = 'application/json'; - var amz_date = moment.utc().format('YYYYMMDD[T]HHmmss[Z]'); - var date_stamp = moment.utc().format('YYYYMMDD'); + var method = 'POST'; + var endpoint = '/CreateGiftCard'; var amz_target = 'com.amazonaws.agcod.AGCODService.CreateGiftCard'; - var canonical_querystring = ''; - /************* TASK 1: CREATE A CANONICAL REQUEST *************/ - - var canonical_headers = - 'accept:' + accept + '\n' + - 'content-type:' + content_type + '\n' + - 'host:' + credentials.AMAZON_ENDPOINT.replace('https://', '') + '\n' + - 'x-amz-date:' + amz_date + '\n' + - 'x-amz-target:' + amz_target + '\n'; - - var signed_headers = 'accept;content-type;host;x-amz-date;x-amz-target'; - data = JSON.stringify(data); - var payload_hash = CryptoJS.SHA256(data).toString(CryptoJS.enc.Hex); - var canonical_request = 'POST' + '\n' + '/CreateGiftCard' + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash; - - /************* TASK 2: CREATE THE STRING TO SIGN *************/ - - var algorithm = 'AWS4-HMAC-SHA256'; - var credential_scope = date_stamp + '/' + credentials.AMAZON_REGION + '/' + credentials.AMAZON_SERVICE_NAME + '/' + 'aws4_request'; - var hashed_canonical_request = CryptoJS.SHA256(canonical_request).toString(CryptoJS.enc.Hex); - var string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashed_canonical_request; - - /************* TASK 3: CALCULATE THE SIGNATURE *************/ - - var signing_key = _getSignatureKey(); - var signature = CryptoJS.HmacSHA256(string_to_sign, signing_key).toString(CryptoJS.enc.Hex) - var authorization_header = algorithm + ' ' + 'Credential=' + credentials.AMAZON_ACCESS_KEY + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature; - - /************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST *************/ - - var headers = { - 'Content-Type': content_type, - 'Accept': accept, - 'X-Amz-Date': amz_date, - 'X-Amz-Target': amz_target, - 'Authorization': authorization_header - }; + var headers = _getHeaders(data, method, endpoint, amz_target); $http({ - 'method': 'POST', - 'url': credentials.AMAZON_ENDPOINT + '/CreateGiftCard', - 'data': data, + 'method': method, + 'url': credentials.AMAZON_ENDPOINT + endpoint, + 'data': JSON.stringify(data), 'headers': headers }).then(function(data) { - $log.info('Amazon Create Gift Card: SUCCESS'); + $log.info('Amazon.com Gift Card Create/Update: SUCCESS'); var newData = data.data; newData['bitpayInvoiceId'] = dataSrc.bitpayInvoiceId; newData['bitpayInvoiceUrl'] = dataSrc.bitpayInvoiceUrl; - newData['date'] = now; + newData['date'] = dataSrc.date || now; root.saveGiftCard(newData, null, function(err) { return cb(null, newData); }); }, function(data) { - $log.error('Amazon Create Gift Card: ERROR ' + data.statusText); + $log.error('Amazon.com Gift Card Create/Update: ERROR ' + data.statusText); + return cb(data.statusText); + }); + }; + + root.cancelGiftCard = function(dataSrc, cb) { + var data = { + 'creationRequestId': dataSrc.creationRequestId, + 'partnerId': credentials.AMAZON_PARTNER_ID, + 'gcId': dataSrc.gcId, + }; + + var method = 'POST'; + var endpoint = '/CancelGiftCard'; + var amz_target = 'com.amazonaws.agcod.AGCODService.CancelGiftCard'; + + var headers = _getHeaders(data, method, endpoint, amz_target); + + $http({ + 'method': method, + 'url': credentials.AMAZON_ENDPOINT + endpoint, + 'data': JSON.stringify(data), + 'headers': headers + }).then(function(data) { + $log.info('Amazon.com Gift Card Cancel: SUCCESS'); + return cb(null, data.data); + }, function(data) { + $log.error('Amazon.com Gift Card Cancel: ERROR ' + data.statusText); return cb(data.statusText); }); }; From a63a8e4aaaa6bdba0e0b65e562c007f0e7e37bb5 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 19 May 2016 20:20:06 -0300 Subject: [PATCH 05/51] Fix mobile response --- src/js/controllers/amazon.js | 6 ++++++ src/js/controllers/buyAmazon.js | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/js/controllers/amazon.js b/src/js/controllers/amazon.js index df90a6373..30d2770df 100644 --- a/src/js/controllers/amazon.js +++ b/src/js/controllers/amazon.js @@ -15,6 +15,9 @@ angular.module('copayApp.controllers').controller('amazonController', return; } self.giftCards = gcds; + $timeout(function() { + $scope.$digest(); + }); }); }; @@ -69,6 +72,9 @@ angular.module('copayApp.controllers').controller('amazonController', return; } $scope.card = data; + $timeout(function() { + $scope.$digest(); + }); }); }; diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index 074fe04af..30b0401f4 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -49,6 +49,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', }; $scope.openWalletsModal = function(wallets) { + if (self.loading) return; self.error = null; self.errorInfo = null; var ModalInstanceCtrl = function($scope, $modalInstance) { @@ -94,6 +95,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', }; this.setAmount = function(plus) { + if (self.loading) return; if (plus && $scope.fiat < maximumAmount ) { stepAmount = stepAmount + 1; $scope.fiat = stepAmount * multiplierAmount; @@ -184,6 +186,9 @@ angular.module('copayApp.controllers').controller('buyAmazonController', return; } self.giftCard = giftCard; + $timeout(function() { + $scope.$digest(); + }); }); }); } From e8c299b401688fceb9b4e067e1b9f0f83a3ac6dc Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 20 May 2016 18:29:54 -0300 Subject: [PATCH 06/51] Amazon.com guidelines --- public/img/GCs-logo-cllb.png | Bin 0 -> 22574 bytes public/img/a-smile_color_btn.png | Bin 0 -> 25102 bytes public/img/a_generic.jpg | Bin 0 -> 37442 bytes public/img/amazon-card.png | Bin 9650 -> 0 bytes public/img/amazon-gift-card.png | Bin 6648 -> 0 bytes public/img/amazon-item.png | Bin 2127 -> 0 bytes public/views/amazon.html | 60 +++++++--- public/views/buyAmazon.html | 111 ++++++++++++------- public/views/includes/sidebar.html | 4 +- public/views/modals/amazon-card-details.html | 6 +- src/js/controllers/amazon.js | 1 + 11 files changed, 119 insertions(+), 63 deletions(-) create mode 100644 public/img/GCs-logo-cllb.png create mode 100644 public/img/a-smile_color_btn.png create mode 100644 public/img/a_generic.jpg delete mode 100644 public/img/amazon-card.png delete mode 100644 public/img/amazon-gift-card.png delete mode 100644 public/img/amazon-item.png diff --git a/public/img/GCs-logo-cllb.png b/public/img/GCs-logo-cllb.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad1c7abaf1b4dd9ef61f5ae7d7eec950ec70da1 GIT binary patch literal 22574 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 literal 0 HcmV?d00001 diff --git a/public/img/a_generic.jpg b/public/img/a_generic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5690b2a1c707feb5a900fa42fbcc567406e9144a GIT binary patch literal 37442 zcmd3NWl$VU)8GO@LV(~9+%>p+aCZyt4ht;q2@*WGF78fnhu{vuWs%^zB)G$o=k>d< zuCDIBA2(aOH9ONbJw4Xb^St=H0l=5^w6O#LWMvruNPvH(=VJhdgqxY27XSwE>ZRBm z0C?VjJF#|kb>e4X0lF}om^+$UFq=6#uy~p{v9K|-vH%1{Je^F;>?~Z#Of9TzfI<|% z+PWynY|Moyw7C>n6`jN_tZihxK^E%XN*ZR~c4mC$6e7Z8f}Z@I4o(ght|nxj4)#D7 zeorBazlig{}rv;%X;EA^L|a*+)ecGI2+c1sNAJE0Y;3H!B%88#5aRCl3$L zdop%bHdYo^b`~~vCN>^^4t9Q4R_^Px{&QJiC!eEGgcf^+xX7d+ZUQrG{ zF$r;Y4pBaFHa1BPF)m(SQAs{tK5jAg7i{i-;K~ABTup#x7Jr!j!L|7pF5CYWmtP!Y zVdClt(r|RN|A(olSUb8px>!3pk%_Bwk!jli%^f{l{`BJC<+K3VxLcS@fgByk{^|yP zoBx8lC>N`^6pth~8@r^WBpVwWuP7@UFDDxt4>y~Hl%%K>#ouww|4m*0XtfwGJ3BiU zpEw7P1kWE_(LXp`qU@}kVxsKa;_MVGFT$9c@w?i%+FShHK1J5^91{^1ozMMcXU`7n3vj@ z?>{U4PczTo0T@Uyd@vVqFc<(>3>Y{JnCCvg%FBfJLJ$rH=C8K=`FV|u^acSD77iZf z)k`T1{2$K$tb~DudxeOE0RI{p9RNUpg@J>EeFcMv@EQ>n@TUqM0f2~vf%%#o3z-dD zlmZ7APt}C75#N)~nO%*8iuZGzm^df3N7Fk{1C2Wm0e`M(txH|Kn-*=#LbKP4R4^~p zUWgzfAR{5Z@PvWI_(PJM4HHom3rW?40{ge~XLg*p+?sAN5U!djC5QU!sg1z+JaH;c zF8o@vggQ5Fcb=YUmtGB5ym!yb02H{F)?vV507L+FBB|LN-f#P~a)UEkB>9#F&aIl# zcmE#)4uBr)k>h)QRE5$!Vj@~uV>=Um7%zK2`uH*CqbN~Ca z_m8f4AM*@|!tHwotd2i@CvDFR!02k=`AvHA^tgBO_SocJ`)2Zv=aAInI@|6+>KQPl zY*oDUH1iB7Z}aOK4P1~OJYfV;{3B7$N=VO2Ncc%eI2nliw{`SCM18TEtNT$O5yz9# zW1p<+x;00;HR$oRUuQ?wo>j47rnk2-NyUGof&Clb|KGAiN4kelaLWl>`nj@Q`NVve zBArH_jqYZtfLr|#(ExqGQqEC@Ih9hHME6R7J<^9u)=%C)xl`EtGc<29Z}ql0JeQy; zy7RvBrNZ>u*G&%f=D(z@DM&Mk-KxOL=I;d1G4|JVR^)PL&SCsm^*r!G*?sGcdQzfd zWxsh0qnVvRGcHPt3W9|TO4Yeg$TR#!Ra+g8Etc!->glerQPdk%RzC!=%)m2m{iep! z_tkD^Qo)kHRN{d&M%G7(zk!0=uEx^lj^CbZey!9k`zEFyQ`*W&7jrAbs=mOW{(WT8 z2v(TL81QLuu$TnzYJ{5QNOOsiEbKKPXw440FQ)|fd7tKxOgQ)GC@`xC1TRSF8KlXD z$@6vM{bvpGFcW1RiM$-_9n7#ejSmq8PB0g23J5TlFfc=Tv}MvN2Eu&8xQgjV(A{Jk90)iH`X0USt;!7Z)LE1|vs2EVh}p#w^i_%Vz#HS6PghIJt$C-znW)Ug zp0$sJCcVe}5HtLrrZ|1veHG)1ZKCX#bTAfiD&ocJkKPgO1ES9WT48*_-rQVjj(#P1 zn)L{rL5x)0=c6 zg3L$6WI^CEfxf1DKHU-V*H@En59h%Xpx1VK6fior#Ge!wDd26$O7C0`Rl1#JInbSC z{yU~t#O2EQiWC8CVzEraj7Et4Sw&8{rfr}6?Gf=8pe%?xCNwBGQgk-40=$Qe9ZnW# zr7HgR1I%{^ierB!VX}qC_>qmCtA5WjbNt;LfwbYMp7y= zEw6IwH9iO?!V>jqZXv#6H)fLC3uKY+pTKig58*WDn#8#fZkcuiQN=5(7k%e({{XP+I&@kp8-M=i)JSA_AX9kk-8W8aGHb`vY7w3u zcYetjg>8`Dz};;msUt6{$mR2nVotfAE1pmKmX#0t_gT{EyB~x_{QZp&PBK!by}%?M zP~^T3+!CTU!o_g`PE=1V)Fdur=Ioco$*Yc-j?cd^X;7AES6U>8#;XF9i>He^gns2* z^WeKTv`L@A>FZodE#!6K-*Yi94jymoq^>H>-E$@IkI@(xs_fUj!LSF<>LbCtjmADzm`80bus2;xu$S&tr)m0k+Nef|o)4zGBmk)ejcKdz&6RCL zFA2!uNBtG@|GNLd&bg-uyoeeONz#o;5)oFPJlF3F;I4_&dg^ zsPwZp4)xwEco8*x)e4+;75i@^iZ9SG8Vwa9PQXMc+H4q(;WG>HSV?&8kdz>zzt%`J z5xd4YYqyrRq|H$nr4p_D4Ee=M?zFJGM|TAJG_}64rcwE z8MRU(E#<9A(+3HUYvWFRlQ#y|X6^MEG>9Q?7Mpd=TRO<0=!n4bv#In6XKq<+@h<4t zrGKVGX{sNqc+>H=?o4RLuT5oPw;=}-8sMG#dL_@jMsZp%zd=ZA`s1=#Et__P#0bXx zNO0VUx;xEdI-nVSKw<=4;G3RJm8JgAzfDs7*}gU-0pu51kRSIj5$v3qgH=G?=^t~h zm>_krm7k>Fg>)m{^Wn>>+a!Vw0μ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 literal 0 HcmV?d00001 diff --git a/public/img/amazon-card.png b/public/img/amazon-card.png deleted file mode 100644 index 6c65982eddc51470a7164d19c9af2d45d6f78c25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9650 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 diff --git a/public/views/amazon.html b/public/views/amazon.html index 0b62b612d..e8c0b2bca 100644 --- a/public/views/amazon.html +++ b/public/views/amazon.html @@ -1,6 +1,7 @@

    @@ -26,7 +27,7 @@
    -
    +
    @@ -40,36 +41,65 @@
    -
    - Amazon Gift Card +
    + Amazon.com Gift Card
    -
    +
    + -
    -

    Cards

    + +
    + +
    +
    + + + + + Your cards +
    - {{id}} + {{id}}
    -
    - {{item.cardInfo.value.amount | currency : item.cardInfo.value.currencyCode + ' ' : 2}} +
    + {{item.cardInfo.value.amount | currency : '$ ' : 2}}
    -
    +
    Error Resend is required - {{item.date * 1000 | amTimeAgo}} + {{item.date * 1000 | amTimeAgo}}
    -
    +
    +
    + *Amazon.com Gift Cards ("GCs") sold by BitPay, Inc., an authorized and independent + reseller of Amazon.com Gift Cards. Except as required by law, GCs cannot be transferred for value or redeemed for cash. + GCs may be used only for purchases of eligible goods at Amazon.com or certain of its affiliated websites. Purchases are + deducted from the GC balance. To redeem or view a GC balance, visit “Your Account” at Amazon.com. Amazon is + not responsible if a GC is lost, stolen, destroyed or used without permission. See + www.amazon.com/gc-legal for complete terms, + restrictions and exceptions. For any other questions, see + www.amazon.com/gc. GCs are issued + by ACI Gift Cards, Inc., a Washington corporation. All Amazon ®, ™ & © are IP of + Amazon.com, Inc. or its affiliates. No expiration date or service fees. +
    +
    diff --git a/public/views/buyAmazon.html b/public/views/buyAmazon.html index 348587901..f38a739d2 100644 --- a/public/views/buyAmazon.html +++ b/public/views/buyAmazon.html @@ -1,14 +1,14 @@
    + ng-init="titleSection='Buy'; goBackToState = 'amazon'">
    -
    +
    @@ -41,8 +41,10 @@
    - Amazon Gift Card -
    Redeem online
    + Amazon.com Gift Card +
    + Use your Amazon.com Gift Card* to shop from a huge selection of books, electronics, music, movies, software, apparel, toys, and more. +
    - - - ${{fiat}} - + + - + $ {{fiat}} + +
    -
    - Use your Amazon.com Gift Card to shop from a huge selection of books, electronics, music, movies, software, apparel, toys, and more. -
    -
    - + ng-style="{'background-color': index.backgroundColor}" + type="submit" value="Order now">
    -
    -
    -

    Amazon.com Gift Card could not be created

    +
    +
    +

    Gift card could not be created

    There was an error when trying to create the Amazon.com Gift Card. Status: {{buy.giftCard.status}} @@ -104,47 +102,74 @@
    -
    -

    Gift card ready to redeem!

    - -
    - - {{buy.giftCard.cardInfo.value.amount | currency : buy.giftCard.cardInfo.value.currencyCode + ' ' : 2 }} - +
    +
    + Thank you for participating in the BitPay offer. It is our pleasure to send + you this Amazon.com Gift Card* that can be redeemed towards millions of items at + www.amazon.com. You may want to print this screen + for easy reference later--you’ll need the gift card claim code below
    -
    -
    Claim code
    -
    {{buy.giftCard.gcClaimCode}}
    +
    + Amazon.com Gift Cards +
    + Gift Card Amount: + + {{buy.giftCard.cardInfo.value.amount | currency : '$ ' : 2 }} + +
    +
    + Claim code: {{buy.giftCard.gcClaimCode}} +
    +
    + +
    -
    - + -
    - To redeem your gift card, follow these steps: + +
    +
    To redeem your gift card, follow these steps:
      -
    1. Visit www.amazon.com/gc.
    2. +
    3. Visit www.amazon.com/gc.
    4. Click Apply to Account and enter the claim code when prompted.
    5. Gift card funds will be applied automatically to eligible orders during the checkout process.
    6. You must pay for any remaining balance on your order with another payment method.
    +

    Your gift card claim code may also be entered when prompted during checkout. + To redeem your gift card using the Amazon.com 1-Click® service, first add the gift card + funds to Your Account.

    +

    If you have questions about redeeming your gift card, please visit + www.amazon.com/gc-redeem. + If you have questions regarding the BitPay offer, please contact BitPay.

    -
    -
    BitPay invoice
    -
    {{buy.giftCard.bitpayInvoiceId}}
    - -
    +
    + *Amazon.com Gift Cards ("GCs") sold by BitPay, Inc., an authorized and independent + reseller of Amazon.com Gift Cards. Except as required by law, GCs cannot be transferred for value or redeemed for cash. + GCs may be used only for purchases of eligible goods at Amazon.com or certain of its affiliated websites. Purchases are + deducted from the GC balance. To redeem or view a GC balance, visit “Your Account” at Amazon.com. Amazon is + not responsible if a GC is lost, stolen, destroyed or used without permission. See + www.amazon.com/gc-legal for complete terms, + restrictions and exceptions. For any other questions, see + www.amazon.com/gc. GCs are issued + by ACI Gift Cards, Inc., a Washington corporation. All Amazon ®, ™ & © are IP of + Amazon.com, Inc. or its affiliates. No expiration date or service fees. +
    +
    diff --git a/public/views/includes/sidebar.html b/public/views/includes/sidebar.html index 98e5db930..724bd8f9c 100644 --- a/public/views/includes/sidebar.html +++ b/public/views/includes/sidebar.html @@ -32,9 +32,9 @@
  • - +
    - Gift Card + Gift Cards
  • diff --git a/public/views/modals/amazon-card-details.html b/public/views/modals/amazon-card-details.html index b8ae6ae90..e61726a51 100644 --- a/public/views/modals/amazon-card-details.html +++ b/public/views/modals/amazon-card-details.html @@ -1,4 +1,4 @@ -