From 3f0c437996839b351d91f335f4896b803df6c58b Mon Sep 17 00:00:00 2001 From: pbca26 Date: Thu, 7 Dec 2017 19:56:26 +0300 Subject: [PATCH 1/8] dex coin icons, swap history, prices, coin list --- react/package.json | 1 - react/src/actions/actions/mm.js | 30 +- react/src/actions/storeType.js | 3 +- react/src/assets/dex/coins/kmd.svg | 1 - react/src/assets/dex/coins/mnz.svg | 10 - react/src/assets/images/cryptologo/blk.png | Bin 0 -> 13448 bytes react/src/assets/images/cryptologo/block.png | Bin 0 -> 5057 bytes react/src/assets/images/cryptologo/bsd.png | Bin 0 -> 11344 bytes react/src/assets/images/cryptologo/btcz.png | Bin 0 -> 15770 bytes .../assets/images/cryptologo/chips (copy).png | Bin 0 -> 7422 bytes react/src/assets/images/cryptologo/chips.png | Bin 7422 -> 8963 bytes react/src/assets/images/cryptologo/hodlc.png | Bin 0 -> 3643 bytes react/src/assets/images/cryptologo/iop.png | Bin 0 -> 15275 bytes react/src/assets/images/cryptologo/maga.png | Bin 0 -> 3741 bytes react/src/assets/images/cryptologo/mshark.png | Bin 0 -> 3767 bytes react/src/assets/images/cryptologo/zen.png | Bin 0 -> 7116 bytes .../dashboard/navbar/navbar.render.js | 3 +- react/src/components/dex/dexCoins.js | 338 ++++++++++++++---- react/src/components/dex/dexLogin.js | 4 +- react/src/components/dex/dexMain.js | 32 +- react/src/components/dex/dexSwapHistory.js | 79 +++- react/src/components/dex/svg/arrowRight.js | 25 ++ react/src/components/dex/svg/mnz.js | 19 - .../src/components/dex/table/dexSwapsTable.js | 216 +++++++++++ react/src/components/dex/table/pagination.js | 50 +++ .../components/dex/table/pagination.render.js | 103 ++++++ react/src/components/dex/table/table.scss | 92 +++++ react/src/components/main/walletMain.js | 38 +- react/src/reducers/dex.js | 18 +- react/src/styles/dex/_base.scss | 52 ++- react/src/styles/dex/_helpers.scss | 2 +- react/src/styles/dex/components/coinList.scss | 2 +- 32 files changed, 978 insertions(+), 140 deletions(-) delete mode 100644 react/src/assets/dex/coins/kmd.svg delete mode 100644 react/src/assets/dex/coins/mnz.svg create mode 100644 react/src/assets/images/cryptologo/blk.png create mode 100644 react/src/assets/images/cryptologo/block.png create mode 100644 react/src/assets/images/cryptologo/bsd.png create mode 100644 react/src/assets/images/cryptologo/btcz.png create mode 100644 react/src/assets/images/cryptologo/chips (copy).png create mode 100644 react/src/assets/images/cryptologo/hodlc.png create mode 100644 react/src/assets/images/cryptologo/iop.png create mode 100644 react/src/assets/images/cryptologo/maga.png create mode 100644 react/src/assets/images/cryptologo/mshark.png create mode 100644 react/src/assets/images/cryptologo/zen.png create mode 100644 react/src/components/dex/svg/arrowRight.js delete mode 100644 react/src/components/dex/svg/mnz.js create mode 100644 react/src/components/dex/table/dexSwapsTable.js create mode 100644 react/src/components/dex/table/pagination.js create mode 100644 react/src/components/dex/table/pagination.render.js create mode 100644 react/src/components/dex/table/table.scss diff --git a/react/package.json b/react/package.json index 6218bdce0..f50b05ea7 100644 --- a/react/package.json +++ b/react/package.json @@ -41,7 +41,6 @@ "qrcode.react": "^0.7.1", "rc-tree": "^1.4.6", "react": "^15.3.1", - "react-cryptocoins": "^1.0.10", "react-dom": "^15.3.1", "react-hot-loader": "^1.3.0", "react-qr-reader": "^1.1.3", diff --git a/react/src/actions/actions/mm.js b/react/src/actions/actions/mm.js index 6f3da0180..dd3ed54e6 100644 --- a/react/src/actions/actions/mm.js +++ b/react/src/actions/actions/mm.js @@ -10,6 +10,8 @@ import { DEX_UTXO, DEX_CACHE_PRELOAD, DEX_PRICES, + DEX_STATS, + DEX_ACTIVE_SECTION, } from '../storeType'; import { translate } from '../../translate/translate'; import Config from '../../config'; @@ -18,7 +20,7 @@ import { } from '../actionCreators'; import Store from '../../store'; -export function shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swaps, rates) { +export function shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swaps, rates, coinsHelper, electrumServersList) { return { type: DEX_CACHE_PRELOAD, isAuth, @@ -28,6 +30,8 @@ export function shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swa coins, swaps, rates, + coinsHelper, + electrumServersList, } } @@ -88,7 +92,6 @@ export function shepherdMMStop() { } export function shepherdMMRequest(payload) { - console.warn(payload); return dispatch => { return fetch( `http://127.0.0.1:${Config.agamaPort}/shepherd/mm/request`, { @@ -101,7 +104,7 @@ export function shepherdMMRequest(payload) { ) .catch((error) => { console.log(error); - Store.dispatch( + dispatch( triggerToaster( 'shepherdMMRequest', 'Error', @@ -111,21 +114,34 @@ export function shepherdMMRequest(payload) { }) .then(response => response.json()) .then(json => { - dispatch(shepherdMMRequstState(payload.mapToProp, json)); + console.warn(json); + dispatch(shepherdMMRequestState(payload.mapToProp, json)); }); } } -export function shepherdMMRequstState(prop, json) { +export function shepherdMMRequestState(prop, json) { if (prop === 'prices') { return { type: DEX_PRICES, prices: json, } - } else if (prop === 'statsdisp') { + } else if (prop === 'stats') { return { type: DEX_STATS, - prices: json, + stats: json, + } + } else if (prop === 'swaps') { + return { + type: DEX_SWAPS, + swaps: json, } } +} + +export function dexActiveSection(section) { + return { + type: DEX_ACTIVE_SECTION, + section, + } } \ No newline at end of file diff --git a/react/src/actions/storeType.js b/react/src/actions/storeType.js index 37924bf99..ccf94f5ee 100644 --- a/react/src/actions/storeType.js +++ b/react/src/actions/storeType.js @@ -61,4 +61,5 @@ export const DEX_UTXO = 'DEX_UTXO'; export const DEX_PRICES = 'DEX_PRICES'; export const DEX_RESET = 'DEX_RESET'; export const DEX_STATS = 'DEX_STATS'; -export const DEX_CACHE_PRELOAD = 'DEX_CACHE_PRELOAD'; \ No newline at end of file +export const DEX_CACHE_PRELOAD = 'DEX_CACHE_PRELOAD'; +export const DEX_ACTIVE_SECTION = 'DEX_ACTIVE_SECTION'; \ No newline at end of file diff --git a/react/src/assets/dex/coins/kmd.svg b/react/src/assets/dex/coins/kmd.svg deleted file mode 100644 index 958e0c9db..000000000 --- a/react/src/assets/dex/coins/kmd.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/react/src/assets/dex/coins/mnz.svg b/react/src/assets/dex/coins/mnz.svg deleted file mode 100644 index d8e50a201..000000000 --- a/react/src/assets/dex/coins/mnz.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/react/src/assets/images/cryptologo/blk.png b/react/src/assets/images/cryptologo/blk.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc4b2da603047212d89f0d080f0b529b32f870c GIT binary patch literal 13448 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 Xh@LFWvU?GM00000NkvXXu0mjf6WoJQ literal 0 HcmV?d00001 diff --git a/react/src/assets/images/cryptologo/bsd.png b/react/src/assets/images/cryptologo/bsd.png new file mode 100644 index 0000000000000000000000000000000000000000..07ae8029700957b83e90f2139e87fb88be7a924e GIT binary patch literal 11344 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 literal 7422 zcmZ{JRZtuZ6C@!xK^Av+4G@Cc;x56R#e+lGWg$S&;O-jS-92n@cXto&i|4-op6=xy zrsuJ%rmClUro%PV|0^_<|Il?OSsMX?qF+%)O4}>z%mmd- z$2tR?;|m5aE@v;B$WzK{6qd2jfalz@G;KI4=*-chvZW&U@&l8QfC{wV&~(ZJ|DqSd zkz7U2$8Q>`)U}2f;v`3w9ybavd1@K4 zL-8bn_uiF0n}#Gjam=+o2isi*#S`BXP+qV~*wV9pR-|-%q>|q_XhJU|@O~jq*o-TT zhTry)pP$#_SuiqK4^~X!pEL6+;Qf@YnfOt~nwx_Yf(Pk|GNMMX5F0}cU~$R?_P1cPlzyFRB??wPuq zOm1_=QlaO;MVG#oE9Nwqj^f}E(K$1spZ+R+ya9AWYBXFuO(>Z-jpXRN=xGOo6Jc(~-^pE-h8u`zd33E%&u7c(a8^;5{jhu^s;nCDx4K-|Wqb|d4DrMd&Zzl=C zsc4DW^&v_=2-gG=(TcpUyA9JuV{6Uyjc*+JeN-5Js82hN(u#-PTMXrgXe#)*S6Sq! z_v9dIDmnS|+6vo5m*B_R8+Z?>OE=^W>u6|sNo#v^vo;Cjd4IFjz-ww!r( z9vm}GFi(zixx%k@ORH;$gJmcMf3%2+3Y$sCL91eP79{ZQGkuuf25(Z-Bg9tK$Jl^bF$$I9>#)#sKi=SffkR!-RAFbf$T*0+Ig(o9W-|h=_5#wh# zdgAxBzTFj1{CY$DP$^XkM9!;sbo=&N33|l9v=57_nXYw}h)!fz8YGCmlcNOWp_0+3 zsQh=3sTe;LF$n2x=lB%2W8RN$ij}&*w;ReDu!~?kp0MLYz;6SI((;IiC#FgaEM!|( zzJ;0#o~51(ew?B_9MJ9xB*LZjorHVs@!K28ApPm<5qWBLPS$$DCCwZIlT~SUQbBJ| zQzER43*U{m2hDEu=h@u%Ql9sDMX`Z?V8W?5%UDj;v(HHjpW+C$(OIj?u$fQ|Me^i!MrmFowSS5LKr@({#16zX(zhIkyP)(z$<*pf~Ye4`K1$RIf>4t*G7$ zD(+%uU`pF;u}HKCcAn?^?YR)l(gFmhhUMTn0e)Ke3}c_B@s=g8S~gw{=F+DlX3<~4 z_kkJLh;3cMdxXRgg$m}U)_mtf-@p&jPkBzZ{tuODNr&eAZ@x6c54-uxMirJ+__}$E zBp9~*JVGjAWd7W@x5QI(+NepI$4aafexT1&S{yNAz&CLbZXDa|8%+lkOF3WZ_s2&< zxsils%Bjv<;VL#6u#D zf1hWDQRo0g;@p1SZu+j2beB^tGK87iIOS;ty~PjRQFJWCJ&LeEW{pjZ?V(A(*(=r2XKT+6tE1y`wK6mHKA>S z0%Y7; zSMWnu&^6P8eQV+*AONeQ<%Xl`%)H`RhxEjw3pu-XEXAL^8oD|m_xJ4Q5y_*l5n>|X zc{v}grxpLgZWU5fb5mYrJDDOWX{o(kAz%u)$bjd3ubPIJm*d@WHjVl(*ki`xxj za&J)VcOMP$e5HdVp8mVi$|SpyOqoN~rQkeHqs`I3Mq@{Y60DO4*QEze37AH(T$@)~fynL!edVI80P z&!CdS4*UTcwEwWu?hP;^@lGK(7&Hf!q~k?!hyCbK{p&z{dK_&KS#l-Tbz%4V*8edR zOex$*zThuYh)b*ZhjrBc*OqYP&Y(==hkmkUExve+ zc9XA2g~6wHPIo0Cf%mzB7AO+t|WSAvI<|S)b{lab@x*zx zgRy=*V)cZI{zT^!+ER~ zj)J>hxZ%b{c{XZ}~)9hSul%Yzx7?dx$+t?hC#PYs+ zC{3ke%KkRgbN1n+OoT#Cw@y@$qylo@r>oU{dRgy@#K63oh~SXIw3ckoxf73qu*j;- zp;IA@a;R> zErm-SZu&-qxf5F?;U89x7RilHrAqVsfdtIVPRDfDphFfES7wMm__Jx|E}I-bbpt=s z0NRqw$H8bK4=S0aRyl`aB3T{c=ks>l^$-e#LV7w#STbMmFnL z!I479qXszm39_Wqp+gD}r%SZX+IgV3-m@sJa-lstLM7f=!-;zF!b!Lc3VRM8d$Xj_ zbl>Kn(#{Q~1Vl~rUqpARNqnUg1L;|@GQk3fRdgA&lsueP9E^idj-9x=PCGH4o*m^8 zFw80w)tUo{S@4bh75NNgi$0|4j);KW-ktO-ynVJ7xD9kEyUeg@!Jf$Snse_Tr`LsX zb5zO;^g2N&^7WxFP~B!Tuh!aPr>iTCa0FS+ej)2FIxYK#6nn;yMO?s3w+)J?IB^fR z5#QiM7EfhFJtyZKA%#%pPn=<;9USUrGfN9uWIuH`hn)mQkt2H-`IBy=IG9%Z7dl&c zsP(+YY)*hF5%+QMbp{!acM%RTGBs;acUih|-wxIK9Dt1~Q+2;N4#urPD-=>0!rYkg zw-YNxC4z8#@FVR43EeONUB)O=4EcZ|P;qCcF&ibUii1#TX??FJLly-4`#Gp%1fPgI zWl?(^uEs55_^M~F2x&Se7%reRj4qv;Hl%Yd9hhOTIx&|uEgpfw>nvf6p7JOiVqit% zf=l|2ioe<<*9zIP_FP7oElO#2y5b$bpHPB6EQ2*wl&#o7h*r#!4TZn6?5q+i2nUhZ zWZrS9_px?Yr;~T%o!5S;zeaU_!~XW3EJZeP#FpxV$pP|^}Jl`@XDTGeKz9N=R-g3w!*LPospa7+?*`@ zxa_F2ZErtduK2|HSdtwk9Ou>)b-^ls(t|nR<1N}h>LHgH#S^m1SgAKpe*cz{QI3`67u;RR3;-o6t znuufsXK;RB-u%ilY;j3%lsNBsZ63bSGD*X_nhF{w7BtcKZkl_3|379wexH7krn=aC z);HR@KGDGX(m_pfjzAm9#5v1Retb`m_$-L&oiMslNfx)o zwp1@s|6uJr#jlYr)oF8fMFw^#;8Eue#MO-oT%)Y|$MtZRwa*v#U81N-T7l|g@Z$Oa zR$vtm&eJeAs{+})dxD~ZZPvsjadnw8p<2Y2cuH2*N_<)vqZQBkU8B`&T`a-Ko@-?S zr8(GMcXaOo#-)@x+et)_l&tCIlTP;_!~($i)!0pW0rjzXLB#2Z;tT19G!@)!B3mAC zUrS#5>J5ca+EsQ$cc3;eU>prH{n7Q%n4>F8Pp7-t28__>$TJ!#A1pV}$(~nQO}Mt= zj}?gIupKsON5i#0@sj4&m_&|G^T56e`dtp$Vs2l6AhuXrAI>pYZ0dh2zGFsMlV!=D zOYt%KI+SfS;c16O9z5`?yOm-IXa3!LjdKayxH|0yMd*Au^$Z>oe9UEQ6P?Kx)PBTF$K;M^689mRP(mw0u(DWN z<;aR*o)uM-ktIkrYwN3DV`ip;Pmw25Q6cC$V*h@6Vx$GLi%H9-9^V_PujXI4&n%;O$P8`5dB#-xg-f98J4aIdRIc836M%w<-&#%= z51@WxdQ6;f5MY1{etTo@&6(NwMt|1ypObUieEw9b1{^m9a+4f3G<^|E`b>t_OPXLq!6B_`Oekr|P>2F!SfT==;Yh#>MCt^y+3-R+fBO?j=VZ zpdy2)rdF>br^`u?Nvp$gzHDax{_$)#^hU9j0)^I%nS&!q3x*Z0;Qq-~Rpqa|s~l@< zNu#liuhhU%6U?rUK>c9w%%Ionk}*r(s|NKHG0ynLZQy^x;iPMck@Z=_O?d7vCbeMg z)T4(YArJBvc;@p*aul!BXUJ5GTJ=+ic@(cMppRxnllLpw?(+tG$Ij{8c_fNqeaX;n zZ=|W_wvtabtKdrvYac+_hAqi13m0|i+`ch-)P<0_qZ-IJvtTE0t%fBT{gRPjvLT%R zwd(rq1pgt|9?(Tm^^6_YRjK~n*1C-=Gqi0~B4jW^0_L!<{onT^xPNq0*7r+6okq+K zdaRuDR#RhR1i*eAT+ZS(I$#1}t;%xT@o-dEATS^#4(sfaG{lMhHm?Fnmox|;z3&)n zZe@z6+(7Y|MDvfSQ5|D(#{x=Ge8rzL2|5cfMz;bv|C9?xs)W9h9kYQES)JTk#$_Wg zSqIgnM0hBlpb|dC{ckVz%NVJVWF%|nM_jMT*}K1!2;A062*ygP^%ar#8GWV)54Qo6 zkxX9c03#$+S0*Vub50a%dHrfub9siPuVQ!`Zkkc%t3qO=q7d=K^@=v?%%@`iRH9r(uOqdv;;lTXZaiZe#l3%i-m z;ZpTG1(VkVY;dE2XV{jADN*GrJ-m#8+H0J0_y6((T@vnN=)J4$dOVu@&|}--kXoIh zNb(eV%~oQMz%V`vHDxG{EiWenH?0a^uSW=?vhXAWKZbqsHSu%$Rlce))FuFR-W4gzu9OKMn$+jJt1R5VB z5M~hLD;EnVA&-i_{0rYy?4+!P_5A$7{f*+={IqZn+YzE!0x^X}bFGlRd-C{fyK0q_ zhE@(8JI{vl=oo=BkjToBb0+s@^Kcl^3mBFR^g57IsS%s+Fm(QKXEz?jH&o`Ztun}b~OZWqytsgi>pviHsU87L3W!YIOzKx9T z?jNq=yN{vxHu0xKy`ZyvMFAUIJ&5eN@F8;%-T%MyEgy#hcTxy!Ky=3W`C@+hxLepb zYF|>KB}StH$ImAK6?vFHNt0D0A@@hsC*3uUSlu?fY+7Q5p>Jt?`NAIJ!O3Yk$stvB zb#w(gR12vx;*&L#>-Dl@T{mD`Q~Uu;IxEM7U?a<+x;5i0c9xGhsYO!gdF=&UiB zmReBN6wfle$*Rosy&n!aAJ~sT%n$*0Gl*GOpA+}{L)||M#x&(nBiV8(B@;0aoEle_ zlzTqDLiUqKS4tMl8uUN{76APuhz6T((7&%AE8W|42aUGN2Tu++1U@nr4fr%MN7-0B znp*AUoJ}crNV+-3_ecO)g?Li?ojn`<{?VoBUeh}a^z$zKA@}Kq2Dp#XP;=51CJU|-Q$M{ieDB>gQi!kvxNyw&oHMb5`3=2s6gzWSd z=F9~c@%QILGwV%?(}-5ch36?s#X^hN#gA)qQcb9h+DPZvYuHC?1G!$1*=dCW)c+7U zIhJbEp`!I#m&>w&$y2m)SP1$etWx`QXV$V$cw4HPGA^#J>bG{~?a{|MQPA(drSb_r ziMISZL$;6=CMa*c^B}iyU}XlK%Q=|4Y^X2Ia-;jYn&5$kTSXt`)bL5Y=MaLT&^87k z>?@FaK;cq^rMbfpqcSOWG-NY_g@Ya6C=-q^r0WpRTH)A*22^QbdKF8wS$FYDoA|R# z;bNI+b;P_D{zD|{qDEXvS0rq0!71NtSu8&-hCzQi6q^W)bh`~qESf;1*Pl^*pi4^m3I;*H zih9)Eihui6>Lbc19p0v%gbHeX`{pgIRm!z}_yQ3ngs|QUxWrfRlc$0&UmiAE6qW^~ zCH5Wq2$VdMx5THoP~wp!RsE?W{;3AyHYb(4JX@1Zn|pC-@-g@&7{m`lk}GdTHR`80U^YCz7;VD^J6iEPm+07sLt@-|7U_HUO3 z?VdLol?#7o^8oA$ZnWcdWW+ew+!XdJsc|=9@y0$+)#uEHD{;|VBE6_U}>b|7SBIKtX zxyEQJQE!c83O2iLy`$%bAY7RqCL$#Myh#+{lL_YR0d)ON1B@5~tl|&5qfi<)90j^`K)z9Mr-IulOt@gNA(FHz#uYlrzVPz|EYGgkV@fGLLJJsQU8z zL*wVA6>`_&T9UV6R?z48RZ8RDo3=sEBM+!n6p6Xvuv7l}2GJ5`IJsO(Y+A!Pll;lw zT*PO)%(U+XxtpjJ#;JZQy}Ydj9fz&)2iI9c2Wcce(y{)8F#mB9np@rYYPOCc;e6@< zGB|@6HuK^qZH~z@oMUAq?=TNVUTD_>`Wql4D+@c4#j8Ht_8ot@>@ngKXg>muh%$cp z@9oXiKs`?2Ipyb}*Hg!iQjJ5v(vL4L%kV)7Y#MKnjPXP0qB$lrFYGBSP)$q_;H{Vd z$ddMsG}ZPsH=8DmJ2bYf23cJ~+wgt&pGB|g;1pKQq?#fd9=)Hsi?4F1HhZW!pSfxY zVkMZal9jxpjX%)W6e8iLaMZEKqKB{E=1VEqQJ4M{uVXhHHQ*ZBl0~0?7bJ`eLmK@o zam9rbaONH=L68ozNG4nV#<$H z>7^m?1OEe<;DTf=0M~i;#(lPMOyx=$=Kv&nzT~IO+t=ITe+D~l_GkWi!-c^`|FI-ww8?yYKf2Sz}Mgn;LVwlr3@_Ne|nn z5QZEMndtQg-VEs{M2i+u;5(|k76jS@%cIHoo4Y^R=!*1@QF}bZqZF-)Q9X#+$>7PT z8Xqw++p{H{t~FvWuI!zQmg}y$nwJ4M93~gw(OKj9Yql* zWnWKZD~FUMOT`h@QSpvbo%j8`pY!?s@jln{JokNH&-MLY%YEH{Jc*9>R+18`5<)^k zk~Y?OXTj*W{fLVR-f1$cHG)BfM{wu4u>E*^GKVUJ^JSl+0&SRN8r7Lf_6-Z}p<;!E zMEvQl?mTyr9frbY8j`nd3`3bg0<@42)+{uLOkq%Yz*AHjon-=AZfXGm>Aof)HzWx{ z3bLg7)2+ifRF`mjS4ud8V(betGX-KpF#-Z6l}84KG6Pv$OsEOyZ(fXGzO4p>fPb6t z7$%_aLAjG0ftG9z6^Jy18&DunC=i7*gd&hA6!b6<27$uB5W$TyfFdwR6b6O{{@e-uhkGH@t42n;oZfSJtgy#BW4 z@|>yv6UM(>!|}3ks-9B2(zBZH3Ixxv6Z@LO%N4+JEcvXIUN6qLE~Efj5U?Yk@-yO6;&mb@sj> zZIL7)yt`Ul+F2t(>CjPvaD9R;@DYHdf6dgDz$^(U=ww*~vLc*yNc*S3OMT(vO-oZR z&0Z}(&FXn>a)ysA3YOb!ZL#6opIX-^I;S*h?T=%i`Em z!`X@n-YiqQuB8K|cSocbD&#i^k_XS0tFJ&2@e-lRDn!+;{u%3wKJ6+W&VDYuCKjDv z<3^#TUB~4Q=Ib^~lf__}-O}ZWwP`~SS0=C_nb5ujDCjfx_->}K0H9~8_(fw zA#Uc%Ch4N<8Q1czory8OV*GQ{%Da9KGtU}_cqsEBC|Ikq{_X*<4(+{?h?LZxX8B2b zcC32&hew8%fOC09RQYVgFZ2WTgT3`_di@Vzytl;HV-HlQ zIGBX3%abBhbFJen7Ovv1oma5bIhxDWr-<}V+Q>Xu)qdsD*}tge7>$C-nwpV9^R18a zHXMR>8R)8d{mCwm+#`3I4MbA(Q~c}2*C?$pqtKl7$B;ZD(CoX- z%yjsJaEuJbTz%wSrN+qu@`Q!Hf@zPh#8$)pp+6S7Cc7G3^@QVY1$08)fd)N5e%3-< z>;qm-Ps$g@yzhV|5804yD7vg&TvV~KmV$UUkn$L~ljB^aObh14K3q>RK>6eM$~YOV z(cu}bF%Dx2bF6FQ*d(8o8*M~QzkKYFaK0N#ai9Rcdo+lLD-Q6WGho&jF zbnCtPR;Lq^R8D67eDz^MI5>+tmy(4OA&AyzG49g~LH@HlKkpLlXhgR~6~rk=L3>;QJu&Ve>-yN-eu}3U!Qj?94z`( z#?$>KEd2UVsuOb~E$en_?X%3gMwAS`=+R3UcomlU8&aQ%>lOb)a<>i;`O4952UClr{7_RQJ z-XWF6%HTKaMV>2C4b2hhw?e#NUYZ8bni;gN4o$ke)F+SKo>EsXU$^=MEn?LZCYQZk zwUW~>BUhW+qRM{ZP9f&Kz{voaGtaqKcPa03Gu4lFEeTTEe7$-ILeu!Kl-u?viyrZb zn|4wIzdhExdxWcKv+`wM?w!IdzvI1$*JglE6rfK5j-!Dj8;vbrHJqdxsuJBotOU(2 z5so2uIVy&Lk|ao5Rx%T;1AT|tr6#BM7B9FhrK3RNQ`#+R*p2*0bypfcJJ=yr?j8um&C=O=%tbV?e6hc{@E2JByS0%N7x&nOZbU|mgNqeYF7iSiD z;C(^LrFId&O#EwJQKH$yWcTh%x$RD4?NTzj?=EU9By#RPVUA14`tNsgyr8`A6W`WA}odKTepyzFVW5F)R zVw05}H^zs9K0cexeZ5>OtF5Ve^IgM7dS7lPzO*)^MkOMdDSe~%!iry>NXQH2o)7y! zG=_*)+vi3=Z_71$w8N^9t&v0fgpZ!@Ei$z8Fmy>WEq4F>fc0diFtTIquYA3XWkd3r zi~z*(o8+-pgzW=`H?gX#c|N<%774R`mkLhLT1RaRxygHcrQ*p>$lP)DeKZZnd=9!> zPt$^{4rxpdH1-)06V6gq3(YN5Qm6udTL4QVsS=3z^M3)d^jdN|)Qj{WY2v14wVLDh zJ*8uP1Z?=AB6fy7yHxCvRK6K~5z|Gp7Jd-!?)l_zi z)?{C55-z9OPlFvH%v{8mdc_62oSMIi=hS6$=$|2x_%89reG2+C)EEas^CWNA8Cewl$QCq66Y-jM4d+0dP2q^*|p#b zVcCkwrIt$VwoNT9C&lCew*A-CZznTP+13O`UnT(I{NmdRN}66V0Zv<^x{Y_6vWJ7c zlLI=gwy4U=Y&?Iu2T?QX63__zaxcXo>^=ldy=PO89dbCP5xt4MT!L2_|KtAbvdP!3 zw?{EXUlda##(O%d#aAB(?)g|o0pD%E41eS2XMCch|62TPK%c(rX3|U6t9uQt?vbVb5D^pC_M!_CwujUG!re+nn=0(XhV>|M;KH=QhP%fy zbNgk!4Ua7X3+T=Fl45$TchJ0V)@6E%oRS5|Wv!K$PCM($Rq8pM+k1$R?bfJP=dP+& z0}GS87@>Y=KfrLAkkvN$dgV;)K7#k$Dk!j-?6^1auaBML=@_At!>&75c|1E#P0gg0 z{xqiy2%El;|5Q=EsQ<}w*kl8Z-m@C2XyfknOJ`s&4J;x>K*7i(KnL$2oT8pNzP` z_NZEEqE80a?$0D1x(V<~OQ?FJ)q4+KOjB~ted8INNo=mc8b^rN5#Q+@T3tUYTPZnu zPR@8vhj4{qcPeQZFj|-5+QV#mov^DT>U`?BU0c*N5Rij*gGZktuutSgBHgq#zP>G~ zrV_RoqGS2CHwGncWyeNk?|7W?q%L1HAR%1CBa+rIIcF{=+JhduQW{)sYggt0x@WcV z;!>4=~WT-=g? Z2zkx8!&zFtCT;)D*%0jUH!XZ({u`OiIjsNy literal 0 HcmV?d00001 diff --git a/react/src/assets/images/cryptologo/iop.png b/react/src/assets/images/cryptologo/iop.png new file mode 100644 index 0000000000000000000000000000000000000000..eedd107e761a2d449ecb47241847db482da58447 GIT binary patch literal 15275 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 literal 0 HcmV?d00001 diff --git a/react/src/assets/images/cryptologo/maga.png b/react/src/assets/images/cryptologo/maga.png new file mode 100644 index 0000000000000000000000000000000000000000..0dff41cd7131c92193663ddf38baea6214ff23fb GIT binary patch literal 3741 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 Hu0mjfz^MKB literal 0 HcmV?d00001 diff --git a/react/src/assets/images/cryptologo/mshark.png b/react/src/assets/images/cryptologo/mshark.png new file mode 100644 index 0000000000000000000000000000000000000000..f321f3c63bc213886b4a69885d0ae510324703f5 GIT binary patch literal 3767 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 literal 0 HcmV?d00001 diff --git a/react/src/assets/images/cryptologo/zen.png b/react/src/assets/images/cryptologo/zen.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc99d605a47e9dc21fc172489080b223d9de31d GIT binary patch literal 7116 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 { translate('INDEX.WALLETS') } -
  • +
  • -1 ? '' : ' hide') }> this.dashboardChangeSection('dex') }> BarterDEX diff --git a/react/src/components/dex/dexCoins.js b/react/src/components/dex/dexCoins.js index c9f0ad825..c9ceb8dcd 100644 --- a/react/src/components/dex/dexCoins.js +++ b/react/src/components/dex/dexCoins.js @@ -1,15 +1,17 @@ import React from 'react'; import { translate } from '../../translate/translate'; import SVGFaviconBlack from './svg/faviconBlack'; -import SVGMNZ from './svg/mnz'; import DexLoaderSmall from './dexLoaderSmall'; import mainWindow from '../../util/mainWindow'; -import * as coinIcon from 'react-cryptocoins'; import Store from '../../store'; import { shepherdMMRequest, + dexActiveSection, } from '../../actions/actionCreators'; import { connect } from 'react-redux'; +import DexSwapHistory from './dexSwapHistory'; + +// TODO: extend price pairs to include all possible combinations class DexCoins extends React.Component { constructor() { @@ -20,13 +22,33 @@ class DexCoins extends React.Component { btc: 0, }, coinLoading: false, + prices: {}, + renderAddCoin: false, }; this.calcTotalBalance = this.calcTotalBalance.bind(this); + this.togglePrices = this.togglePrices.bind(this); + this.toggleSwaps = this.toggleSwaps.bind(this); + this.toggleAddCoin = this.toggleAddCoin.bind(this); + } + + toggleAddCoin() { + this.setState({ + renderAddCoin: !this.state.renderAddCoin, + }); + } + + togglePrices() { + Store.dispatch(dexActiveSection(this.props.Dex.section === 'prices' ? 'coins' : 'prices')); + } + + toggleSwaps() { + Store.dispatch(dexActiveSection(this.props.Dex.section === 'swaps' ? 'coins' : 'swaps')); } getPrices(props) { const _dex = props.Dex; let _prices = {}; + let _pairDiv = {}; if (_dex && _dex.prices && @@ -34,61 +56,250 @@ class DexCoins extends React.Component { for (let i = 0; i < _dex.prices.length; i++) { for (let j = 0; j < _dex.prices[i].asks.length; j++) { if (!_prices[_dex.prices[i].asks[j][0] + '/' + _dex.prices[i].asks[j][1]]) { + _pairDiv[_dex.prices[i].asks[j][0] + '/' + _dex.prices[i].asks[j][1]] = 1; _prices[_dex.prices[i].asks[j][0] + '/' + _dex.prices[i].asks[j][1]] = _dex.prices[i].asks[j][2]; - } else { + } else { // average + _pairDiv[_dex.prices[i].asks[j][0] + '/' + _dex.prices[i].asks[j][1]] += 1; _prices[_dex.prices[i].asks[j][0] + '/' + _dex.prices[i].asks[j][1]] += _dex.prices[i].asks[j][2]; } } } - } - - console.warn(_prices); - } - renderCoinsList() { + for (let key in _prices) { + _prices[key] = (_prices[key] / _pairDiv[key]).toFixed(8); + } + } + this.setState({ + prices: _prices, + }); + console.warn('prices', _prices); } - calcTotalBalance() { - mainWindow.getMMCacheData() - .then((res) => { - const { rates, coins } = res; - let _coins = {}; + renderBalanceTotal() { + if (this.props.Dex && + this.props.Dex.coins && + this.props.Dex.rates && + this.state.prices) { + const coins = this.props.Dex.coins; + const prices = this.state.prices; + const rates = this.props.Dex.rates; let _totalKMDValue = 0; - if (rates && - rates.BTC && - rates.USD) { - for (let i = 0; i < coins.length; i++) { - console.log(coins[i].coin + ' ' + coins[i].balance); - _coins[coins[i].coin] = coins[i]; - if (Number(coins[i].balance) > 0) { - _totalKMDValue += Number(coins[i].KMDvalue); + for (let i = 0; i < coins.length; i++) { + // console.log(coins[i].coin + ' ' + coins[i].balance); + if (Number(coins[i].balance) > 0) { + console.warn(coins[i].balance, `${coins[i].coin}/KMD ${prices[`${coins[i].coin}/KMD`]}`); + + if (coins[i].coin === 'KMD') { + _totalKMDValue += Number(coins[i].balance); + } else { + _totalKMDValue += Number(coins[i].balance) * prices[`${coins[i].coin}/KMD`]; } } - console.log(_totalKMDValue); } - }); - } - getCoinSVG(coin) { - // todo add asset chains - if (coin !== 'MNZ') { - const SVGCryptoCoins = coinIcon.BtcAlt; - return ; + return ( +

    + + { (_totalKMDValue * rates.BTC).toFixed(8) } BTC + { (_totalKMDValue).toFixed(8) } KMD + ${ (_totalKMDValue * rates.USD).toFixed(8) } +

    + ); } else { - return SVGMNZ; + return null; + } + } + + calcTotalBalance(rates, coins, prices) { + let _coins = {}; + let _totalKMDValue = 0; + + if (rates && + rates.BTC && + rates.USD) { + for (let i = 0; i < coins.length; i++) { + console.log(coins[i].coin + ' ' + coins[i].balance); + _coins[coins[i].coin] = coins[i]; + if (Number(coins[i].balance) > 0) { + _totalKMDValue += Number(coins[i].KMDvalue); + } + } + console.log(_totalKMDValue); } } componentWillMount() { - this.calcTotalBalance(); + // this.calcTotalBalance(); } componentWillReceiveProps(props) { this.getPrices(props); } + renderCoins() { + const _coins = this.props.Dex.coins; + const _coinsHelper = this.props.Dex.coinsHelper; + let _items = []; + + if (this.state.renderAddCoin) { + _items.push( +
  • + + + + + + +
    + + +
    +
    + Back +
    +
    +
  • + ); + } + + for (let i = 0; i < _coins.length; i++) { + const _coinName = _coinsHelper[_coins[i].coin].name ? _coinsHelper[_coins[i].coin].name : (_coinsHelper[_coins[i].coin].asset ? _coinsHelper[_coins[i].coin].asset : _coinsHelper[_coins[i].coin].coin); + + if ((!this.state.renderAddCoin && _coins[i].status === 'active') || + (this.state.renderAddCoin && _coins[i].status === 'inactive')) { + _items.push( +
  • + +
    + + + +
    +
    + { _coinName.indexOf('coin') > -1 && _coinName.indexOf('itcoin') === -1 ? _coinName.replace('coin', 'Coin') : _coinName } + + { _coins[i].balance } { _coins[i].coin } + + { _coins[i].electrum ? 'Electrum mode' : 'Native mode' } +
    + + + + + + { this.state.coinLoading && + + } +
    +
  • + ); + } + } + + if (!this.state.renderAddCoin) { + _items.push( +
  • + +
    + + +
    +
    + Add new coin +
    + + + + + +
    +
  • + ); + } + + return _items; + } + + renderPrices() { + let _prices = this.state.prices; + let _items = []; + + _prices['KMD/USD'] = this.props.Dex.rates.USD; + _prices['BTC/USD'] = this.props.Dex.rates.USD * _prices['BTC/KMD']; + + for (let i = 0; i < 2; i++) { + for (let key in _prices) { + const _pair = key.split('/'); + + if ((i === 1 && key !== 'KMD/USD' && key !== 'BTC/USD') || (i === 0 && (key === 'KMD/USD' || key === 'BTC/USD'))) { + _items.push( +
  • +
    +
    +
    +
    + + { _pair[0] } + +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    + + { _pair[1] } + +
    +
    + { _prices[key] } { _pair[1] } +
    +
    +
    +
    +
  • + ); + } + } + } + + return ( +
    +
      + { _items } +
    +
    + ); + } + render() { return (
    @@ -100,12 +311,10 @@ class DexCoins extends React.Component {
    { /* portfolio chart here */ }
    -

    - - 0.00345625 BTC - $32.21 -

    - + - + { this.props.Dex.section === 'coins' && +
      + { this.renderCoins() } +
    + } + { this.props.Dex.section === 'prices' && +
    { this.renderPrices() }
    + } + { this.props.Dex.section === 'swaps' && + + }
    ); diff --git a/react/src/components/dex/dexLogin.js b/react/src/components/dex/dexLogin.js index f5f30ed35..8bdbf9467 100644 --- a/react/src/components/dex/dexLogin.js +++ b/react/src/components/dex/dexLogin.js @@ -36,8 +36,8 @@ class DexLogin extends React.Component { .then((res) => { console.warn('mm cache', res); - const { rates, coins, isAuth } = res; - Store.dispatch(shepherdMMCachePreloadState(isAuth, null, null, null, coins, null, rates)); + const { rates, coins, isAuth, swaps, asks, bids, pair, coinsHelper, electrumServersList } = res; + Store.dispatch(shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swaps, rates, coinsHelper, electrumServersList)); }); }); } diff --git a/react/src/components/dex/dexMain.js b/react/src/components/dex/dexMain.js index 21383719f..f9624560e 100644 --- a/react/src/components/dex/dexMain.js +++ b/react/src/components/dex/dexMain.js @@ -30,12 +30,27 @@ class DexMain extends React.Component { } componentWillMount() { + if (mainWindow.argv.indexOf('dexonly') > -1) { + Store.dispatch(shepherdMMRequest({ + method: 'statsdisp', + mapToProp: 'stats', + })); + Store.dispatch(shepherdMMRequest({ + method: 'getprices', + mapToProp: 'prices', + })); + Store.dispatch(shepherdMMRequest({ + method: 'swapstatus', + mapToProp: 'swaps', + })); + } + mainWindow.getMMCacheData() .then((res) => { console.warn('mm cache', res); - const { rates, coins, isAuth, swaps, asks, bids, pair } = res; - Store.dispatch(shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swaps, rates)); + const { rates, coins, isAuth, swaps, asks, bids, pair, coinsHelper, electrumServersList } = res; + Store.dispatch(shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swaps, rates, coinsHelper, electrumServersList)); }); } @@ -53,13 +68,17 @@ class DexMain extends React.Component { method: 'getprices', mapToProp: 'prices', })); + Store.dispatch(shepherdMMRequest({ + method: 'swapstatus', + mapToProp: 'swaps', + })); mainWindow.getMMCacheData() .then((res) => { console.warn('mm cache', res); - const { rates, coins, isAuth, swaps, asks, bids, pair } = res; - Store.dispatch(shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swaps, rates)); + const { rates, coins, isAuth, swaps, asks, bids, pair, coinsHelper, electrumServersList } = res; + Store.dispatch(shepherdMMCachePreloadState(isAuth, asks, bids, pair, coins, swaps, rates, coinsHelper, electrumServersList)); }); } else { console.warn('dex'); @@ -87,8 +106,9 @@ class DexMain extends React.Component { } render() { - if (this.props.Dashboard && - this.props.Dashboard.activeSection === 'dex') { + if ((this.props.Dashboard && + this.props.Dashboard.activeSection === 'dex') || + mainWindow.argv.indexOf('dexonly') > -1) { return (
    diff --git a/react/src/components/dex/dexSwapHistory.js b/react/src/components/dex/dexSwapHistory.js index f0d99ea71..b9c4db03b 100644 --- a/react/src/components/dex/dexSwapHistory.js +++ b/react/src/components/dex/dexSwapHistory.js @@ -1,5 +1,7 @@ import React from 'react'; +import { connect } from 'react-redux'; import { translate } from '../../translate/translate'; +import DexSwapsTable from './table/dexSwapsTable'; class DexSwapHistory extends React.Component { constructor() { @@ -8,9 +10,70 @@ class DexSwapHistory extends React.Component { }; } - render() { + renderSwapHistory() { + const _swaps = this.props.Dex.swaps.swaps; + let _items = []; + + for (let i = 0; i < _swaps.length; i++) { + _items.push( +
  • +
    +
    +
    +
    + + 0.00397501 + +
    + + + + +
    +
    +
    + finished + + + + + +
    +
    +
    + + + + + + + + + + + +
    + + 0.03048882 + +
    +
    +
    +
    +
  • + ); + } + return (
    +
      + { _items } +
    +
    + ); + } + +/*
    • @@ -58,9 +121,21 @@ class DexSwapHistory extends React.Component {
    +*/ + + render() { + return ( +
    +
    ); } } -export default DexSwapHistory; \ No newline at end of file +const mapStateToProps = (state) => { + return { + Dex: state.Dex, + }; +}; + +export default connect(mapStateToProps)(DexSwapHistory); diff --git a/react/src/components/dex/svg/arrowRight.js b/react/src/components/dex/svg/arrowRight.js new file mode 100644 index 000000000..11626471b --- /dev/null +++ b/react/src/components/dex/svg/arrowRight.js @@ -0,0 +1,25 @@ +import React from 'react'; + +class SVGArrowRight extends React.Component { + render() { + return ( + + + + + + + + + + + + + + + + ); + } +} + +export default SVGArrowRight; \ No newline at end of file diff --git a/react/src/components/dex/svg/mnz.js b/react/src/components/dex/svg/mnz.js deleted file mode 100644 index 11cd0f218..000000000 --- a/react/src/components/dex/svg/mnz.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; - -class SVGMNZ extends React.Component { - render() { - return ( - - - - - - - - - - ); - } -} - -export default SVGMNZ; \ No newline at end of file diff --git a/react/src/components/dex/table/dexSwapsTable.js b/react/src/components/dex/table/dexSwapsTable.js new file mode 100644 index 000000000..6ef33fd0e --- /dev/null +++ b/react/src/components/dex/table/dexSwapsTable.js @@ -0,0 +1,216 @@ +import React from 'react'; +import ReactTable from 'react-table'; +import TablePaginationRenderer from './pagination'; +import { connect } from 'react-redux'; +import { translate } from '../../../translate/translate'; +import { sortByDate } from '../../../util/sort'; +import { formatValue } from '../../../util/formatValue'; +import Config from '../../../config'; +import { + triggerToaster, +} from '../../../actions/actionCreators'; +import Store from '../../../store'; +import { secondsToString } from '../../../util/time'; + +const BOTTOM_BAR_DISPLAY_THRESHOLD = 15; + +class DexSwapsTable extends React.Component { + constructor(props) { + super(props); + this.state = { + itemsList: [], + filteredItemsList: [], + itemsListColumns: this.generateItemsListColumns(), + defaultPageSize: 20, + pageSize: 20, + showPagination: true, + searchTerm: null, + loading: false, + }; + } + + // https://react-table.js.org/#/custom-sorting + tableSorting(a, b) { // ugly workaround, override default sort + if (Date.parse(a)) { // convert date to timestamp + a = Date.parse(a); + } + if (Date.parse(b)) { + b = Date.parse(b); + } + // force null and undefined to the bottom + a = (a === null || a === undefined) ? -Infinity : a; + b = (b === null || b === undefined) ? -Infinity : b; + // force any string values to lowercase + a = typeof a === 'string' ? a.toLowerCase() : a; + b = typeof b === 'string' ? b.toLowerCase() : b; + // Return either 1 or -1 to indicate a sort priority + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + // returning 0 or undefined will use any subsequent column sorting methods or the row index as a tiebreaker + return 0; + } + + generateItemsListColumns(itemsCount) { + let columns = []; + let _col; + + _col = [{ + id: 'direction', + Header: translate('INDEX.DIRECTION'), + Footer: translate('INDEX.DIRECTION'), + className: 'colum--direction', + headerClassName: 'colum--direction', + footerClassName: 'colum--direction', + accessor: (item) => (item.iambob === 0) ? 'Buyer' : 'Seller', + }, + { + id: 'pair', + Header: 'Pair', + Footer: 'Pair', + className: 'colum--pair', + headerClassName: 'colum--pair', + footerClassName: 'colum--pair', + accessor: (item) => (item.iambob === 0) ? `${item.alice}/${item.bob}` : `${item.bob}/${item.alice}`, + }, + { + id: 'sent', + Header: 'Sent', + Footer: 'Sent', + className: 'colum--sent', + headerClassName: 'colum--sent', + footerClassName: 'colum--sent', + accessor: (item) => (item.iambob === 0) ? `${formatValue(parseFloat(item.values[3]) + parseFloat(item.values[6]))} ${item.alice}` : `${formatValue(parseFloat(item.values[0]) + parseFloat(item.bobtxfee))} ${item.bob}`, + }, + { + id: 'received', + Header: 'Received', + Footer: 'Recevied', + className: 'colum--received', + headerClassName: 'colum--received', + footerClassName: 'colum--received', + accessor: (item) => (item.iambob === 0) ? `${formatValue(item.srcamount)} ${item.bob}` : `${formatValue(item.values[3])} ${item.alice}`, + }, + { + id: 'rate', + Header: 'Rate', + Footer: 'Rate', + className: 'colum--rate', + headerClassName: 'colum--rate', + footerClassName: 'colum--rate', + accessor: (item) => (item.iambob === 0) ? `${formatValue(parseFloat(parseFloat(item.values[3]) + parseFloat(item.values[6])) / parseFloat(item.srcamount))} (${parseFloat(item.values[3]) + parseFloat(item.values[6])} ${item.alice} / ${item.srcamount} ${item.bob})`: `${formatValue(parseFloat(item.values[3]) / parseFloat(parseFloat(item.values[0]) + parseFloat(item.bobtxfee)))} (${formatValue(item.values[3])} ${item.bob} / ${formatValue(parseFloat(item.values[0]) + parseFloat(item.bobtxfee))} ${item.bob})`, + }, + { + id: 'finishtime', + Header: translate('INDEX.TIME'), + Footer: translate('INDEX.TIME'), + accessor: (item) => secondsToString(item.finishtime), + }]; + + if (itemsCount <= BOTTOM_BAR_DISPLAY_THRESHOLD) { + delete _col[0].Footer; + delete _col[1].Footer; + delete _col[2].Footer; + delete _col[3].Footer; + } + + columns.push(..._col); + + return columns; + } + + componentWillMount() { + const _swaps = this.props.Dex.swaps.swaps.filter(swap => swap.alice && swap.finishtime); + + this.setState({ + itemsList: _swaps, + filteredItemsList: this.filterData(_swaps, this.state.searchTerm), + showPagination: _swaps && _swaps.length >= this.state.defaultPageSize, + itemsListColumns: this.generateItemsListColumns(_swaps.length), + }); + } + + componentWillReceiveProps(props) { + console.warn('table will receive props'); + + this.setState({ + itemsList: this.props.Dex.swaps.swaps, + filteredItemsList: this.filterData(this.props.Dex.swaps.swaps, this.state.searchTerm), + showPagination: this.props.Dex.swaps.swaps && this.props.Dex.swaps.swaps.length >= this.state.defaultPageSize, + itemsListColumns: this.generateItemsListColumns(this.props.Dex.swaps.swaps.length), + }); + + console.warn(this.state); + } + + onPageSizeChange(pageSize, pageIndex) { + this.setState(Object.assign({}, this.state, { + pageSize: pageSize, + showPagination: this.state.itemsList && this.state.itemsList.length >= this.state.defaultPageSize, + })) + } + + onSearchTermChange(newSearchTerm) { + this.setState(Object.assign({}, this.state, { + searchTerm: newSearchTerm, + filteredItemsList: this.filterData(this.state.itemsList, newSearchTerm), + })); + } + + filterData(list, searchTerm) { + return list.filter(item => this.filterDataByProp(item, searchTerm)); + } + + filterDataByProp(item, term) { + if (!term) { + return true; + } + + return this.contains(item.alice.toLowerCase(), term) || + this.contains(item.bob.toLowerCase(), term) || + this.contains(secondsToString(item.finishtime).toLowerCase(), term); + } + + contains(value, property) { + return (value + '').indexOf(property) !== -1; + } + + render() { + return ( +
    + this.onSearchTermChange(e.target.value) } + placeholder={ translate('DASHBOARD.SEARCH') } /> + this.onPageSizeChange(pageSize, pageIndex) } /> +
    + ); + } +} + +const mapStateToProps = (state) => { + return { + Dex: state.Dex, + }; +}; + +export default connect(mapStateToProps)(DexSwapsTable); \ No newline at end of file diff --git a/react/src/components/dex/table/pagination.js b/react/src/components/dex/table/pagination.js new file mode 100644 index 000000000..ead45b309 --- /dev/null +++ b/react/src/components/dex/table/pagination.js @@ -0,0 +1,50 @@ +import React, { Component } from 'react'; +import PaginationRender from './pagination.render'; + +export default class TablePaginationRenderer extends Component { + constructor(props) { + super(); + this.state = { + page: props.page, + }; + this.getSafePage = this.getSafePage.bind(this); + this.changePage = this.changePage.bind(this); + this.applyPage = this.applyPage.bind(this); + } + + componentWillReceiveProps(nextProps) { + this.setState({ + page: nextProps.page, + }); + } + + getSafePage(page) { + if (isNaN(page)) { + page = this.props.page; + } + + return Math.min(Math.max(page, 0), this.props.pages - 1); + } + + changePage(page) { + page = this.getSafePage(page); + this.setState({ + page, + }); + + if (this.props.page !== page) { + this.props.onPageChange(page); + } + } + + applyPage(e) { + const page = this.state.page; + + e && e.preventDefault(); + this.changePage(page === '' ? this.props.page : page); + } + + render() { + return PaginationRender.call(this); + } +} \ No newline at end of file diff --git a/react/src/components/dex/table/pagination.render.js b/react/src/components/dex/table/pagination.render.js new file mode 100644 index 000000000..c4d1de6dd --- /dev/null +++ b/react/src/components/dex/table/pagination.render.js @@ -0,0 +1,103 @@ +import React from 'react'; +import classnames from 'classnames'; + +const defaultButton = props => + + +const PaginationRender = function() { + const { + // Computed + pages, + // Props + page, + showPageSizeOptions, + pageSizeOptions, + pageSize, + showPageJump, + canPrevious, + canNext, + onPageSizeChange, + className, + PreviousComponent = defaultButton, + NextComponent = defaultButton, + } = this.props; + + return ( +
    +
    + { + if (!canPrevious) return; + this.changePage(page - 1) + }} + disabled={!canPrevious}> + {this.props.previousText} + +
    +
    + + {this.props.pageText}{' '} + {showPageJump + ? +
    + { + const val = e.target.value; + this.changePage(val - 1); + }} + value={this.state.page === '' ? '' : this.state.page + 1} + onBlur={this.applyPage} + onKeyPress={e => { + if (e.which === 13 || e.keyCode === 13) { + this.applyPage(); + } + }} /> +
    + : + + {page + 1} + }{' '} + {this.props.ofText}{' '} + {pages || 1} +
    + { showPageSizeOptions && + + + + } +
    +
    + { + if (!canNext) return; + this.changePage(page + 1); + }} + disabled={!canNext}> + {this.props.nextText} + +
    +
    + ) +}; + +export default PaginationRender; \ No newline at end of file diff --git a/react/src/components/dex/table/table.scss b/react/src/components/dex/table/table.scss new file mode 100644 index 000000000..a03e87074 --- /dev/null +++ b/react/src/components/dex/table/table.scss @@ -0,0 +1,92 @@ +.search-box { + float: right; + padding-right: 0; +} +.basilisk-progress-bar { + position: absolute; + width: 100%; +} +.breadcrumb--basilisk, +.breadcrumb--native { + top: 0; +} +.dropdown-menu { + .no--hover { + pointer-events: none; + } +} +.ReactTable { + border: none; + + .pagination-bottom { + margin-top: 35px; + } + .rt-td { + text-align: center; + } + .rt-table { + border: 1px solid rgba(0, 0, 0, 0.1); + } + .rt-thead .rt-th, + .rt-thead .rt-td { + padding: 10px 5px; + } + .rt-tr.-odd div, + .rt-tr.-even div { + padding-top: 10px; + padding-bottom: 10px; + } + .-pagination, + .rt-thead, + .rt-tfoot { + border: none; + } + .rt-tfoot { + border-top: 1px solid rgba(0, 0, 0, 0.1); + } + .rt-thead { + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + } + .colum--direction { + width: 40px !important; + flex: 40 0 auto !important; + padding-right: 10px; + } + .colum--txinfo { + width: 40px !important; + flex: 40 0 auto !important; + } + .colum--type { + width: 40px !important; + flex: 40 0 auto !important; + } + .-pagination { + .-pageJump { + margin-right: 5px; + margin-left: 5px; + } + .-btn { + color: #757575; + background-color: #efefef; + border: 1px solid #e0e0e0; + + &:hover { + color: #fff; + } + } + .-btn[disabled]:hover { + color: #757575; + } + } + .rt-noData { + top: 46px; + width: 100%; + text-align: center; + height: 98px; + padding: 38px; + background: rgba(255, 255, 255, 0.85); + } +} +.table-cell-offset-16 { + padding-left: 16px; +} \ No newline at end of file diff --git a/react/src/components/main/walletMain.js b/react/src/components/main/walletMain.js index a4b16b531..544a431e2 100644 --- a/react/src/components/main/walletMain.js +++ b/react/src/components/main/walletMain.js @@ -5,24 +5,32 @@ import AddCoin from '../addcoin/addcoin'; import Login from '../login/login'; import Dashboard from '../dashboard/main/dashboard'; import DexMain from '../dex/dexMain'; +import mainWindow from '../../util/mainWindow'; class WalletMain extends React.Component { render() { - return ( -
    - - - { /* - - */ - } - - - -
    - ); + if (mainWindow.argv.indexOf('dexonly') > -1) { + return ( +
    + + +
    + ); + } else { + return ( +
    + + + + + +
    + ); + } } } diff --git a/react/src/reducers/dex.js b/react/src/reducers/dex.js index 338a8e936..b0a669e15 100644 --- a/react/src/reducers/dex.js +++ b/react/src/reducers/dex.js @@ -13,6 +13,7 @@ import { DEX_RESET, DEX_PRICES, DEX_STATS, + DEX_ACTIVE_SECTION, } from '../actions/storeType'; export function Dex(state = { @@ -30,7 +31,10 @@ export function Dex(state = { prices: {}, utxo: {}, inventory: {}, - stats: {} + stats: {}, + coinsHelper: {}, + electrumServersList: {}, + section: 'coins', }, action) { switch (action.type) { case DEX_CACHE_PRELOAD: @@ -41,10 +45,14 @@ export function Dex(state = { pair: action.pair, coins: action.coins, swaps: action.swaps, + stats: action.stats, rates: action.rates, prices: action.prices, utxo: action.utxo, inventory: action.inventory, + coinsHelper: action.coinsHelper, + electrumServersList: action.electrumServersList, + section: state.section, }; case DEX_RESET: return { @@ -62,6 +70,9 @@ export function Dex(state = { prices: {}, utxo: {}, inventory: {}, + coinsHelper: {}, + electrumServersList: {}, + section: state.section, }; case DEX_LOGIN: return { @@ -111,6 +122,11 @@ export function Dex(state = { ...state, stats: action.stats, }; + case DEX_ACTIVE_SECTION: + return { + ...state, + section: action.section, + }; default: return state; } diff --git a/react/src/styles/dex/_base.scss b/react/src/styles/dex/_base.scss index 499f633f2..cf664cce4 100644 --- a/react/src/styles/dex/_base.scss +++ b/react/src/styles/dex/_base.scss @@ -109,19 +109,53 @@ text-decoration: underline; } - .crypto-icons-pack { - svg { - position: relative; - top: 9px; - left: 10px; - } - } - .dashboard-wallets-list { .coinList-coin { - width: 32%; + width: calc(33% - 20px); float: left; margin-right: 20px; + margin-bottom: 40px; + + img { + position: relative; + top: 4px; + left: 5px; + max-height: 58px; + max-width: 50px; + opacity: 0.9; + border-radius: 50%; + } + .coinList-coin_balance-name { + text-transform: capitalize; + } + &:hover { + img { + opacity: 1; + } + } + } + .add-new-coin { + i { + width: 30px; + height: 30px; + transform: rotate(0deg); + border-radius: 50%; + background: #fff; + } + } + } + + .prices { + .coin-icon-svg { + img { + width: 24px; + height: 24px; + border-radius: 50%; + } + } + .orders-item-wrapper { + width: 100%; + max-width: 600px; } } } \ No newline at end of file diff --git a/react/src/styles/dex/_helpers.scss b/react/src/styles/dex/_helpers.scss index 33189682e..aebe63f3e 100644 --- a/react/src/styles/dex/_helpers.scss +++ b/react/src/styles/dex/_helpers.scss @@ -43,7 +43,7 @@ .coin-icon-placeholder, .coin-icon-svg { - background: rgba(256,256,256,0.1); + background: rgba(255,255,255,1); box-shadow: $box-shadow-inputs; border-radius: 50% !important; } diff --git a/react/src/styles/dex/components/coinList.scss b/react/src/styles/dex/components/coinList.scss index 567e3b9da..fcc4bfc3f 100644 --- a/react/src/styles/dex/components/coinList.scss +++ b/react/src/styles/dex/components/coinList.scss @@ -60,7 +60,7 @@ } .coinList-coin:hover .coinList-coin_action svg { - fill: #FFF; + /*fill: #FFF;*/ transform: translateX(10px) scale(1.1) } From 04a0b192bd0499849e85560def4f9c38d84f3a78 Mon Sep 17 00:00:00 2001 From: pbca26 Date: Fri, 8 Dec 2017 19:59:55 +0300 Subject: [PATCH 2/8] settings app info daemon ports list --- .../settings/settings.appInfoPanel.js | 21 +++++++++++++++---- react/src/components/main/main.js | 2 ++ react/src/translate/en.js | 1 - 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/react/src/components/dashboard/settings/settings.appInfoPanel.js b/react/src/components/dashboard/settings/settings.appInfoPanel.js index ceee561ba..7d79b2459 100644 --- a/react/src/components/dashboard/settings/settings.appInfoPanel.js +++ b/react/src/components/dashboard/settings/settings.appInfoPanel.js @@ -14,6 +14,17 @@ class AppInfoPanel extends React.Component { if (!releaseInfo) { return null } else { + let _items = []; + let _ports = mainWindow.getAssetChainPorts() + + for (let key in _ports) { + _items.push( + + { key === 'komodod' ? 'KMD' : key }: { _ports[key] }
    +
    + ); + } + return (
    @@ -50,10 +61,6 @@ class AppInfoPanel extends React.Component {
    { translate('SETTINGS.CONFIG') }: { this.props.Settings.appInfo.dirs.configLocation }
    - Iguana { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.iguanaBin } -
    - Iguana { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.iguanaDir } -
    Komodo { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.komododBin }
    Komodo { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.komodoDir } @@ -61,6 +68,12 @@ class AppInfoPanel extends React.Component { Komodo wallet.dat: { this.props.Settings.appInfo.dirs.komodoDir }

    } + { mainWindow.arch === 'x64' && +
    Daemon ports
    + } + { mainWindow.arch === 'x64' && +

    { _items }

    + }
    ); diff --git a/react/src/components/main/main.js b/react/src/components/main/main.js index 44e0ba275..345164f7d 100644 --- a/react/src/components/main/main.js +++ b/react/src/components/main/main.js @@ -23,6 +23,8 @@ class Main extends React.Component { if (appVersion) { document.title = `${appVersion.name} (v${appVersion.version.replace('version=', '')}${mainWindow.arch === 'x64' ? '' : '-32bit'}-beta)`; } + + console.warn(mainWindow.getAssetChainPorts()); } componentWillMount() { diff --git a/react/src/translate/en.js b/react/src/translate/en.js index 9e7dc80ba..dab25c07f 100644 --- a/react/src/translate/en.js +++ b/react/src/translate/en.js @@ -762,7 +762,6 @@ export const _lang = { 'TRADE_HISTORY_SM': 'trade history', 'ELECTRUM_MODE': 'Electrum mode', 'NATIVE_MODE': 'Native mode', - }, }, }; \ No newline at end of file From 113d9eb125d8fbf973dada9e9484a2aa5c81ec19 Mon Sep 17 00:00:00 2001 From: pbca26 Date: Sat, 9 Dec 2017 11:42:18 +0300 Subject: [PATCH 3/8] native wallet info network data --- react/src/actions/actionCreators.js | 4 +- react/src/actions/actions/addCoin.js | 5 +- react/src/actions/actions/logout.js | 59 --- react/src/actions/actions/nativeNetwork.js | 97 +++++ react/src/actions/storeType.js | 3 + react/src/components/addcoin/addcoin.js | 19 +- react/src/components/addcoin/payload.js | 397 ++---------------- .../coindDownModal/coindDownModal.js | 11 +- .../components/dashboard/main/dashboard.js | 3 +- .../settings/settings.appInfoPanel.js | 2 +- .../settings/settings.appSettingsPanel.js | 2 +- .../settings/settings.daemonStdoutPanel.js | 2 +- .../components/dashboard/settings/settings.js | 16 +- .../walletsInfo/walletsInfo.render.js | 192 ++++++++- .../dashboard/walletsNav/walletsNav.js | 28 +- .../walletsProgress/walletsProgress.js | 12 +- .../zcparamsFetchModal/zcparamsFetchModal.js | 10 +- react/src/components/login/login.js | 42 +- react/src/components/main/main.js | 2 - react/src/reducers/activeCoin.js | 37 ++ react/src/util/auth.js | 14 - react/src/util/cacheFormat.js | 51 --- react/src/util/formatBytes.js | 24 ++ 23 files changed, 455 insertions(+), 577 deletions(-) delete mode 100644 react/src/actions/actions/logout.js create mode 100644 react/src/actions/actions/nativeNetwork.js delete mode 100644 react/src/util/auth.js delete mode 100644 react/src/util/cacheFormat.js create mode 100644 react/src/util/formatBytes.js diff --git a/react/src/actions/actionCreators.js b/react/src/actions/actionCreators.js index b9db9f538..05753a25a 100644 --- a/react/src/actions/actionCreators.js +++ b/react/src/actions/actionCreators.js @@ -36,14 +36,11 @@ export * from './actions/nativeSyncInfo'; export * from './actions/nativeSend'; export * from './actions/coinList'; export * from './actions/nativeNewAddress'; -// export * from './actions/logout'; export * from './actions/settings'; export * from './actions/addCoin'; -// export * from './actions/walletAuth'; export * from './actions/copyAddress'; export * from './actions/sysInfo'; export * from './actions/dexCoins'; -//export * from './actions/fullTxHistory'; export * from './actions/cli'; export * from './actions/update'; export * from './actions/jumblr'; @@ -52,6 +49,7 @@ export * from './actions/nativeDashboardUpdate'; export * from './actions/getTxDetails'; export * from './actions/electrum'; export * from './actions/mm'; +export * from './actions/nativeNetwork'; export function changeActiveAddress(address) { return { diff --git a/react/src/actions/actions/addCoin.js b/react/src/actions/actions/addCoin.js index 642631db7..de89372cd 100644 --- a/react/src/actions/actions/addCoin.js +++ b/react/src/actions/actions/addCoin.js @@ -12,7 +12,7 @@ import { startAssetChain, startCrypto, checkCoinType, - checkAC + checkAC, } from '../../components/addcoin/payload'; function iguanaActiveHandleState(json) { @@ -240,10 +240,9 @@ export function shepherdHerd(coin, mode, path, startupParams) { addCoinResult(coin, mode) ); } else { - console.warn(acData); dispatch( triggerToaster( - translate('TOASTR.ERROR_STARTING_DAEMON', coin) + ' ' + translate('TOASTR.PORT_IS_TAKEN', acData.rpc), + translate('TOASTR.ERROR_STARTING_DAEMON', coin) + ' ' + translate('TOASTR.PORT_IS_TAKEN', acData), translate('TOASTR.SERVICE_NOTIFICATION'), 'error', false diff --git a/react/src/actions/actions/logout.js b/react/src/actions/actions/logout.js deleted file mode 100644 index 57f4baf95..000000000 --- a/react/src/actions/actions/logout.js +++ /dev/null @@ -1,59 +0,0 @@ -// TODO: use in dex - -import { - LOGIN, - LOGOUT -} from '../storeType'; -import { triggerToaster } from '../actionCreators'; -import Config from '../../config'; - -function logoutState(json) { - sessionStorage.removeItem('IguanaActiveAccount'); - - return { - type: LOGIN, - isLoggedIn: false, - } -} - -function logoutResetAppState() { - return { - type: LOGOUT, - } -} - -export function logout() { - return dispatch => { - dispatch(walletLock()); - } -} - -function walletLock() { - const payload = { - userpass: `tmpIgRPCUser@${sessionStorage.getItem('IguanaRPCAuth')}`, - agent: 'bitcoinrpc', - method: 'walletlock', - }; - - return dispatch => { - return fetch(`http://127.0.0.1:${Config.iguanaCorePort}`, { - method: 'POST', - body: JSON.stringify(payload), - }) - .catch((error) => { - console.log(error); - dispatch( - triggerToaster( - 'walletLock', - 'Error', - 'error' - ) - ); - }) - .then(response => response.json()) - .then(json => { - dispatch(logoutState(json)); - dispatch(logoutResetAppState()); - }) - } -} \ No newline at end of file diff --git a/react/src/actions/actions/nativeNetwork.js b/react/src/actions/actions/nativeNetwork.js new file mode 100644 index 000000000..2141b2e92 --- /dev/null +++ b/react/src/actions/actions/nativeNetwork.js @@ -0,0 +1,97 @@ +import { + DASHBOARD_ACTIVE_COIN_NET_PEERS, + DASHBOARD_ACTIVE_COIN_NET_TOTALS, +} from '../storeType'; +import { translate } from '../../translate/translate'; +import { triggerToaster } from '../actionCreators'; +import Config from '../../config'; + +export function getNativePeers(coin) { + return dispatch => { + const payload = { + mode: null, + chain: coin, + cmd: 'getpeerinfo', + }; + + const _fetchConfig = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ payload: payload }), + }; + + fetch( + `http://127.0.0.1:${Config.agamaPort}/shepherd/cli`, + _fetchConfig + ) + .catch((error) => { + console.log(error); + dispatch( + triggerToaster( + 'getNativePeers', + 'Error', + 'error' + ) + ); + }) + .then(response => response.json()) + .then(json => { + json = json.result; + dispatch(getNativePeersState(json)); + }) + }; +} + +export function getNativeNettotals(coin) { + return dispatch => { + const payload = { + mode: null, + chain: coin, + cmd: 'getnettotals', + }; + + const _fetchConfig = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ payload: payload }), + }; + + fetch( + `http://127.0.0.1:${Config.agamaPort}/shepherd/cli`, + _fetchConfig + ) + .catch((error) => { + console.log(error); + dispatch( + triggerToaster( + 'getNativeNettotals', + 'Error', + 'error' + ) + ); + }) + .then(response => response.json()) + .then(json => { + json = json.result; + dispatch(getNativeNettotalsState(json)); + }) + }; +} + +export function getNativePeersState(json) { + return { + type: DASHBOARD_ACTIVE_COIN_NET_PEERS, + peers: json, + } +} + +export function getNativeNettotalsState(json) { + return { + type: DASHBOARD_ACTIVE_COIN_NET_TOTALS, + totals: json, + } +} \ No newline at end of file diff --git a/react/src/actions/storeType.js b/react/src/actions/storeType.js index ccf94f5ee..b960965a2 100644 --- a/react/src/actions/storeType.js +++ b/react/src/actions/storeType.js @@ -48,6 +48,9 @@ export const DASHBOARD_ELECTRUM_COINS = 'DASHBOARD_ELECTRUM_COINS'; export const ELECTRUM_SERVER_CHANGED = 'ELECTRUM_SERVER_CHANGED'; export const DISPLAY_ZCASH_PARAMS_FETCH = 'DISPLAY_ZCASH_PARAMS_FETCH'; export const DASHBOARD_REMOVE_COIN = 'DASHBOARD_REMOVE_COIN'; +export const DASHBOARD_ACTIVE_COIN_NET_PEERS = 'DASHBOARD_ACTIVE_COIN_NET_PEERS'; +export const DASHBOARD_ACTIVE_COIN_NET_TOTALS = 'DASHBOARD_ACTIVE_COIN_NET_TOTALS'; + /* dex */ export const DEX_LOGIN = 'DEX_LOGIN'; export const DEX_LOGOUT = 'DEX_LOGOUT'; diff --git a/react/src/components/addcoin/addcoin.js b/react/src/components/addcoin/addcoin.js index 7610f2f0f..d44c4ff16 100644 --- a/react/src/components/addcoin/addcoin.js +++ b/react/src/components/addcoin/addcoin.js @@ -12,6 +12,7 @@ import { } from '../../actions/actionCreators'; import Store from '../../store'; import { zcashParamsCheckErrors } from '../../util/zcashParams'; +import mainWindow from '../../util/mainWindow'; import CoinSelectorsRender from './coin-selectors.render'; import AddCoinRender from './addcoin.render'; @@ -54,14 +55,14 @@ class AddCoin extends React.Component { verifyZcashParamsExist(mode) { return new Promise((resolve, reject) => { if (Number(mode) === -1) { - const _res = window.require('electron').remote.getCurrentWindow().zcashParamsExist; + const _res = mainWindow.zcashParamsExist; const __errors = zcashParamsCheckErrors(_res); if (__errors) { - window.require('electron').remote.getCurrentWindow().zcashParamsExistPromise() + mainWindow.zcashParamsExistPromise() .then((res) => { const _errors = zcashParamsCheckErrors(res); - window.require('electron').remote.getCurrentWindow().zcashParamsExist = res; + mainWindow.zcashParamsExist = res; if (_errors) { Store.dispatch( @@ -147,14 +148,8 @@ class AddCoin extends React.Component { componentWillMount() { this.addNewItem(); - let appConfig; - - try { - appConfig = window.require('electron').remote.getCurrentWindow().appConfig; - } catch (e) {} - this.setState({ - isExperimentalOn: appConfig.experimentalFeatures, + isExperimentalOn: mainWindow.appConfig.experimentalFeatures, }); } @@ -186,8 +181,8 @@ class AddCoin extends React.Component { 'spv': 0, 'native': -1, }; - let _coins = this.state.coins; const _value = e.target.value; + let _coins = this.state.coins; _coins[index] = { [e.target.name]: _value, @@ -336,8 +331,8 @@ class AddCoin extends React.Component { } renderCoinSelectors() { - let items = []; const _coins = this.state.coins; + let items = []; for (let i = 0; i < _coins.length; i++) { const _item = _coins[i]; diff --git a/react/src/components/addcoin/payload.js b/react/src/components/addcoin/payload.js index bffaeec35..973d2a311 100644 --- a/react/src/components/addcoin/payload.js +++ b/react/src/components/addcoin/payload.js @@ -137,371 +137,68 @@ export function checkCoinType(coin) { } export function startCurrencyAssetChain(confpath, coin, mode) { - let AddCoinDataPayload = {}; - let assetChainPorts; + const assetChainPorts = window.require('electron').remote.getCurrentWindow().assetChainPorts; - try { - assetChainPorts = window.require('electron').remote.getCurrentWindow().assetChainPorts; - } catch (e) {} - - let _payloadVar = { - 'userpass': tmpIguanaRPCAuth, - 'unitval': '20', - 'zcash': 1, - 'RELAY': mode, - 'VALIDATE': mode, - 'prefetchlag': -1, - 'poll': 100, - 'active': 1, - 'agent': 'iguana', - 'method': 'addcoin', - 'startpend': tmpPendValue, - 'endpend': tmpPendValue, - 'services': 129, - 'maxpeers': 8, - 'newcoin': coin, - 'name': coin, - 'hasheaders': 1, - 'useaddmultisig': 0, - 'netmagic': '2d8e7803', - 'p2p': 13966, - 'rpc': 13967, - 'pubval': 60, - 'p2shval': 85, - 'wifval': 188, - 'txfee_satoshis': '10000', - 'isPoS': 0, - 'minoutput': 10000, - 'minconfirms': 2, - 'genesishash': '027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71', - 'protover': 170002, - 'genesisblock': '0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2', - 'debug': 0, - 'seedipaddr': '78.47.196.146' - }; - - if (mode === '-1') { - let _payloadVarRegular = Object.assign({}, _payloadVar); - delete _payloadVarRegular.userpass; - _payloadVarRegular.RELAY = -1; - _payloadVarRegular.VALIDATE = 1; - _payloadVarRegular.startpend = 4; - _payloadVarRegular.endpend = 4; - _payloadVarRegular.path = confpath; - - const USDDiff = { - 'coin': 'USD', - 'conf': 'USD.conf' - }; - AddCoinDataPayload.USD = Object.assign({}, _payloadVarRegular, USDDiff); - - const RONDiff = { - 'coin': 'RON', - 'conf': 'RON.conf' - }; - AddCoinDataPayload.RON = Object.assign({}, _payloadVarRegular, RONDiff); - - const RUBDiff = { - 'coin': 'RUB', - 'conf': 'RUB.conf' - }; - AddCoinDataPayload.RUB = Object.assign({}, _payloadVarRegular, RUBDiff); - - const SEKDiff = { - 'coin': 'SEK', - 'conf': 'SEK.conf' - }; - AddCoinDataPayload.SEK = Object.assign({}, _payloadVarRegular, SEKDiff); - - const SGDDiff = { - 'coin': 'SGD', - 'conf': 'SGD.conf' - }; - AddCoinDataPayload.SGD = Object.assign({}, _payloadVarRegular, SGDDiff); - - const THBDiff = { - 'coin': 'THB', - 'conf': 'THB.conf' - }; - AddCoinDataPayload.THB = Object.assign({}, _payloadVarRegular, THBDiff); - - const TRYDiff = { - 'coin': 'TRY', - 'conf': 'TRY.conf' - }; - AddCoinDataPayload.TRY = Object.assign({}, _payloadVarRegular, TRYDiff); - - const ZARDiff = { - 'coin': 'ZAR', - 'conf': 'ZAR.conf' - }; - AddCoinDataPayload.ZAR = Object.assign({}, _payloadVarRegular, ZARDiff); - - const CNYDiff = { - 'coin': 'CNY', - 'conf': 'CNY.conf' - }; - AddCoinDataPayload.CNY = Object.assign({}, _payloadVarRegular, CNYDiff); - - const CZKDiff = { - 'coin': 'CZK', - 'conf': 'CZK.conf' - }; - AddCoinDataPayload.CZK = Object.assign({}, _payloadVarRegular, CZKDiff); - - const DKKDiff = { - 'coin': 'DKK', - 'conf': 'DKK.conf' - }; - AddCoinDataPayload.DKK = Object.assign({}, _payloadVarRegular, DKKDiff); - - const EURDiff = { - 'coin': 'EUR', - 'conf': 'EUR.conf' - }; - AddCoinDataPayload.EUR = Object.assign({}, _payloadVarRegular, EURDiff); - - const GBPDiff = { - 'coin': 'GBP', - 'conf': 'GBP.conf' - }; - AddCoinDataPayload.GBP = Object.assign({}, _payloadVarRegular, GBPDiff); - - const HKDDiff = { - 'coin': 'HKD', - 'conf': 'HKD.conf' - }; - AddCoinDataPayload.HKD = Object.assign({}, _payloadVarRegular, HKDDiff); - - const HUFDiff = { - 'coin': 'HUF', - 'conf': 'HUF.conf' - }; - AddCoinDataPayload.HUF = Object.assign({}, _payloadVarRegular, HUFDiff); - - const IDRDiff = { - 'coin': 'IDR', - 'conf': 'IDR.conf' - }; - AddCoinDataPayload.IDR = Object.assign({}, _payloadVarRegular, IDRDiff); - - const ILSDiff = { - 'coin': 'ILS', - 'conf': 'ILS.conf' - }; - AddCoinDataPayload.ILS = Object.assign({}, _payloadVarRegular, ILSDiff); - - const INRDiff = { - 'coin': 'INR', - 'conf': 'INR.conf' - }; - AddCoinDataPayload.INR = Object.assign({}, _payloadVarRegular, INRDiff); - - const JPYDiff = { - 'coin': 'JPY', - 'conf': 'JPY.conf' - }; - AddCoinDataPayload.JPY = Object.assign({}, _payloadVarRegular, JPYDiff); - - const KRWDiff = { - 'coin': 'KRW', - 'conf': 'KRW.conf' - }; - AddCoinDataPayload.KRW = Object.assign({}, _payloadVarRegular, KRWDiff); - - const MXNDiff = { - 'coin': 'MXN', - 'conf': 'MXN.conf' - }; - AddCoinDataPayload.MXN = Object.assign({}, _payloadVarRegular, MXNDiff); - - const MYRDiff = { - 'coin': 'MYR', - 'conf': 'MYR.conf' - }; - AddCoinDataPayload.MYR = Object.assign({}, _payloadVarRegular, MYRDiff); - - const NOKDiff = { - 'coin': 'NOK', - 'conf': 'NOK.conf' - }; - AddCoinDataPayload.NOK = Object.assign({}, _payloadVarRegular, NOKDiff); - - const NZDDiff = { - 'coin': 'NZD', - 'conf': 'NZD.conf' - }; - AddCoinDataPayload.NZD = Object.assign({}, _payloadVarRegular, NZDDiff); - - const PHPDiff = { - 'coin': 'PHP', - 'conf': 'PHP.conf' - }; - AddCoinDataPayload.PHP = Object.assign({}, _payloadVarRegular, PHPDiff); - - const PLNDiff = { - 'coin': 'PLN', - 'conf': 'PLN.conf' - }; - AddCoinDataPayload.PLN = Object.assign({}, _payloadVarRegular, PLNDiff); - - const AUDDiff = { - 'coin': 'AUD', - 'conf': 'AUD.conf' - }; - AddCoinDataPayload.AUD = Object.assign({}, _payloadVarRegular, AUDDiff); - - const BGNDiff = { - 'coin': 'BGN', - 'conf': 'BGN.conf' - }; - AddCoinDataPayload.BGN = Object.assign({}, _payloadVarRegular, BGNDiff); - - const BRLDiff = { - 'coin': 'BRL', - 'conf': 'BRL.conf' - }; - AddCoinDataPayload.BRL = Object.assign({}, _payloadVarRegular, BRLDiff); - - const CADDiff = { - 'coin': 'CAD', - 'conf': 'CAD.conf' - }; - AddCoinDataPayload.CAD = Object.assign({}, _payloadVarRegular, CADDiff); - - const CHFDiff = { - 'coin': 'CHF', - 'conf': 'CHF.conf' - }; - AddCoinDataPayload.CHF = Object.assign({}, _payloadVarRegular, CHFDiff); - - return AddCoinDataPayload[coin]; - } + return assetChainPorts[coin]; } export function startAssetChain(confpath, coin, mode, getSuppyOnly) { - let assetChainPorts; - - try { - assetChainPorts = window.require('electron').remote.getCurrentWindow().assetChainPorts; - } catch (e) {} + let assetChainPorts = window.require('electron').remote.getCurrentWindow().assetChainPorts; - const _acPayloadOrigin = { - 'unitval': '20', - 'zcash': 1, - 'prefetchlag': -1, - 'poll': 100, - 'active': 1, - 'agent': 'iguana', - 'method': 'addcoin', - 'services': 129, - 'hasheaders': 1, - 'useaddmultisig': 0, - 'pubval': 60, - 'p2shval': 85, - 'wifval': 188, - 'txfee_satoshis': '10000', - 'isPoS': 0, - 'minoutput': 10000, - 'minconfirms': 2, - 'genesishash': '027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71', - 'protover': 170002, - 'genesisblock': '0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2', - 'debug': 0, - 'seedipaddr': '78.47.196.146' - }; - - // TODO: move netmagic to node const acConfig = { - 'SUPERNET': { - 'name': 'SUPERNET', - 'supply': 816061, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'SUPERNET','conf':'SUPERNET.conf','path':confpath,'RELAY':-1,'VALIDATE':0,'startpend':4,'endpend':4,'maxpeers':32,'newcoin':'SUPERNET','name':'SUPERNET','netmagic':'cc55d9d4','p2p':assetChainPorts.SUPERNET - 1,'rpc':assetChainPorts.SUPERNET}) : {}, + SUPERNET: { + supply: 816061, }, - 'REVS': { - 'name': 'REVS', - 'supply': 1300000, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'REVS','conf':'REVS.conf','path':confpath,'RELAY':-1,'VALIDATE':0,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'REVS','name':'REVS','netmagic':'905c3498','p2p':assetChainPorts.REVS - 1,'rpc':assetChainPorts.REVS}) : {}, + REVS: { + supply: 1300000, }, - 'WLC': { - 'name': 'WIRELESS', - 'supply': 210000000, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'WLC','conf':'WLC.conf','path':confpath,'RELAY':-1,'VALIDATE':0,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'WLC','name':'WIRELESS','netmagic':'62071ed3','p2p':assetChainPorts.WLC - 1,'rpc':assetChainPorts.WLC}) : {}, + WLC: { + supply: 210000000, }, - 'PANGEA': { - 'name': 'PANGEA', - 'supply': 999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'PANGEA','conf':'PANGEA.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'PANGEA','name':'PANGEA','netmagic':'5fa45ae8','p2p':assetChainPorts.PANGEA - 1,'rpc':assetChainPorts.PANGEA}) : {}, + PANGEA: { + supply: 999999, }, - 'DEX': { - 'name': 'DEX', - 'supply': 999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'DEX','conf':'DEX.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'DEX','name':'DEX','netmagic':'f2ae0516','p2p':assetChainPorts.DEX - 1,'rpc':assetChainPorts.DEX}) : {}, + DEX: { + supply: 999999, }, - 'JUMBLR': { - 'name': 'JUMBLR', - 'supply': 999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'JUMBLR','conf':'JUMBLR.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'JUMBLR','name':'JUMBLR','netmagic':'7223759e','p2p':assetChainPorts.JUMBLR - 1,'rpc':assetChainPorts.JUMBLR}) : {}, + JUMBLR: { + supply: 999999, }, - 'BET': { - 'name': 'BET', - 'supply': 999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'BET','conf':'BET.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'BET','name':'BET','netmagic':'6b9e3e1b','p2p':assetChainPorts.BET - 1,'rpc':assetChainPorts.BET}) : {}, + BET: { + supply: 999999, }, - 'CRYPTO': { - 'name': 'CRYPTO', - 'supply': 999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'CRYPTO','conf':'CRYPTO.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'CRYPTO','name':'CRYPTO','netmagic':'fced9e2a','p2p':assetChainPorts.CRYPTO - 1,'rpc':assetChainPorts.CRYPTO}) : {}, + CRYPTO: { + supply: 999999, }, - 'HODL': { - 'name': 'HODL', - 'supply': 9999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'HODL','conf':'HODL.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'HODL','name':'HODL','netmagic':'9b13fb5f','p2p':assetChainPorts.HODL - 1,'rpc':assetChainPorts.HODL}) : {}, + HODL: { + supply: 9999999, }, - 'MSHARK': { - 'name': 'MSHARK', - 'supply': 1400000, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'MSHARK','conf':'MSHARK.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'MSHARK','name':'MSHARK','netmagic':'54a5e30c','p2p':assetChainPorts.MSHARK - 1,'rpc':assetChainPorts.MSHARK}) : {}, + MSHARK: { + supply: 1400000, }, - 'BOTS': { - 'name': 'BOTS', - 'supply': 999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'BOTS','conf':'BOTS.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'BOTS','name':'BOTS','netmagic':'5bec8cf7','p2p':assetChainPorts.BOTS - 1,'rpc':assetChainPorts.BOTS}) : {}, + BOTS: { + supply: 999999, }, - 'MGW': { - 'name': 'MGW', - 'supply': 999999, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'MGW','conf':'MGW.conf','path':confpath,'unitval':'20','zcash':1,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'MGW','name':'MGW','netmagic':'6eea5dbb','p2p':assetChainPorts.MGW - 1,'rpc':assetChainPorts.MGW}) : {}, + MGW: { + supply: 999999, }, - 'MVP': { - 'name': 'MVP', - 'supply': 1000000, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'MVP','conf':'MVP.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'services':129,'maxpeers':8,'newcoin':'MVP','name':'MVP','netmagic':'dd5ce076','p2p':11675,'rpc':11676}) : {}, + MVP: { + supply: 1000000, }, - 'KV': { - 'name': 'KV', - 'supply': 1000000, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'KV','conf':'KV.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'KV','name':'KV','netmagic':'b09a2d65','p2p':assetChainPorts.KV - 1,'rpc':assetChainPorts.KV}) : {}, + KV: { + supply: 1000000, }, - 'CEAL': { - 'name': 'CEAL', - 'supply': 366666666, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'CEAL','conf':'CEAL.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'CEAL','name':'CEAL','netmagic':'09e51af8','p2p':assetChainPorts.CEAL - 1,'rpc':assetChainPorts.CEAL}) : {}, + CEAL: { + supply: 366666666, }, - 'MESH': { - 'name': 'MESH', - 'supply': 1000007, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'MESH','conf':'MESH.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'MESH','name':'MESH','netmagic':'f0265c67','p2p':assetChainPorts.MESH - 1,'rpc':assetChainPorts.MESH}) : {}, + MESH: { + supply: 1000007, }, - 'COQUI': { - 'name': 'COQUI', - 'supply': 72000000, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'COQUI','conf':'COQUI.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'COQUI','name':'COQUI','netmagic':'4cbd5ef4','p2p':assetChainPorts.COQUI - 1,'rpc':assetChainPorts.COQUI}) : {}, + COQUI: { + supply: 72000000, }, - 'MNZ': { - 'name': 'MNZ', - 'supply': 257142858, - 'AddCoinData': confpath ? Object.assign({}, _acPayloadOrigin, {'coin':'MNZ','conf':'MNZ.conf','path':confpath,'RELAY':-1,'VALIDATE':1,'startpend':4,'endpend':4,'maxpeers':8,'newcoin':'MNZ','name':'MNZ','netmagic':'4cbd5ef4','p2p':assetChainPorts.MNZ - 1,'rpc':assetChainPorts.MNZ}) : {}, + MNZ: { + supply: 257142858, }, }; @@ -509,23 +206,13 @@ export function startAssetChain(confpath, coin, mode, getSuppyOnly) { if (getSuppyOnly) { return acConfig[coin].supply; } else { - return acConfig[coin].AddCoinData; + return assetChainPorts[coin]; } } } export function startCrypto(confpath, coin, mode) { - let AddCoinData = {}; - - if (coin === 'KMD') { - AddCoinData.KMD = {'coin':'KMD','conf':'komodo.conf','path':confpath,'unitval':'20','zcash':1,'RELAY':-1,'VALIDATE':0,'prefetchlag':-1,'poll':10,'active':1,'agent':'iguana','method':'addcoin','startpend':8,'endpend':8,'services':0,'maxpeers':32,'newcoin':'KMD','name':'Komodo','hasheaders':1,'useaddmultisig':0,'netmagic':'f9eee48d','p2p':7770,'rpc':7771,'pubval':60,'p2shval':85,'wifval':188,'txfee_satoshis':'10000','isPoS':0,'minoutput':10000,'minconfirms':2,'genesishash':'027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71','protover':170002,'genesisblock':'0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2','debug':0} - } - if (coin === 'CHIPS') { - AddCoinData.KMD = {'coin':'CHIPS','conf':'chips.conf','path':confpath,'unitval':'20','zcash':1,'RELAY':-1,'VALIDATE':0,'prefetchlag':-1,'poll':10,'active':1,'agent':'iguana','method':'addcoin','startpend':8,'endpend':8,'services':0,'maxpeers':32,'newcoin':'CHIPS','name':'Chips','hasheaders':1,'useaddmultisig':0,'netmagic':'f9eee48d','p2p':57775,'rpc':57776,'pubval':60,'p2shval':85,'wifval':188,'txfee_satoshis':'10000','isPoS':0,'minoutput':10000,'minconfirms':2,'genesishash':'027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71','protover':170002,'genesisblock':'0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2','debug':0} - } - if (coin === 'ZEC') { - AddCoinData.ZEC = {'coin':'ZEC','conf':'zcash.conf','path':confpath,'unitval':'20','zcash':1,'RELAY':-1,'VALIDATE':0,'prefetchlag':-1,'poll':10,'active':1,'agent':'iguana','method':'addcoin','startpend':8,'endpend':8,'services':129,'maxpeers':32,'newcoin':'ZEC','name':'Zcash','hasheaders':0,'useaddmultisig':0,'netmagic':'24e92764','p2p':8233,'rpc':8232,'pubval':184,'p2shval':189,'wifval':128,'txfee_satoshis':'10000','isPoS':0,'minoutput':10000,'minconfirms':2,'genesishash':'00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08','protover':170002,'genesisblock':'040000000000000000000000000000000000000000000000000000000000000000000000db4d7a85b768123f1dff1d4c4cece70083b2d27e117b4ac2e31d087988a5eac4000000000000000000000000000000000000000000000000000000000000000090041358ffff071f5712000000000000000000000000000000000000000000000000000000000000fd4005000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157','debug':0} - } + const assetChainPorts = window.require('electron').remote.getCurrentWindow().assetChainPorts; - return AddCoinData[coin]; + return assetChainPorts[coin]; } \ No newline at end of file diff --git a/react/src/components/dashboard/coindDownModal/coindDownModal.js b/react/src/components/dashboard/coindDownModal/coindDownModal.js index d43de7f8f..7d46386bb 100644 --- a/react/src/components/dashboard/coindDownModal/coindDownModal.js +++ b/react/src/components/dashboard/coindDownModal/coindDownModal.js @@ -6,10 +6,11 @@ import { getDebugLog, } from '../../../actions/actionCreators'; import Store from '../../../store'; +import mainWindow from '../../../util/mainWindow'; import CoindDownModalRender from './coindDownModal.render'; -const COIND_DOWN_MODAL_FETCH_FAILURES_THRESHOLD = window.require('electron').remote.getCurrentWindow().appConfig.failedRPCAttemptsThreshold || 10; +const COIND_DOWN_MODAL_FETCH_FAILURES_THRESHOLD = mainWindow.appConfig.failedRPCAttemptsThreshold || 10; class CoindDownModal extends React.Component { constructor() { @@ -60,14 +61,8 @@ class CoindDownModal extends React.Component { } componentWillMount() { - let _kmdMainPassiveMode; - - try { - _kmdMainPassiveMode = window.require('electron').remote.getCurrentWindow().kmdMainPassiveMode; - } catch (e) {} - this.setState(Object.assign({}, this.state, { - kmdMainPassiveMode: _kmdMainPassiveMode, + kmdMainPassiveMode: mainWindow.kmdMainPassiveMode, })); } diff --git a/react/src/components/dashboard/main/dashboard.js b/react/src/components/dashboard/main/dashboard.js index 6645be75e..a0b409a44 100755 --- a/react/src/components/dashboard/main/dashboard.js +++ b/react/src/components/dashboard/main/dashboard.js @@ -7,6 +7,7 @@ import { } from '../../../actions/actionCreators'; import { zcashParamsCheckErrors } from '../../../util/zcashParams'; import Store from '../../../store'; +import mainWindow from '../../../util/mainWindow'; class Dashboard extends React.Component { constructor() { @@ -20,7 +21,7 @@ class Dashboard extends React.Component { verifyZcashParams() { if (!this.state.zcashParamsVerifyTriggered) { - const _res = window.require('electron').remote.getCurrentWindow().zcashParamsExist; + const _res = mainWindow.zcashParamsExist; const _errors = zcashParamsCheckErrors(_res); if (_errors) { diff --git a/react/src/components/dashboard/settings/settings.appInfoPanel.js b/react/src/components/dashboard/settings/settings.appInfoPanel.js index 7d79b2459..fc86ebf2d 100644 --- a/react/src/components/dashboard/settings/settings.appInfoPanel.js +++ b/react/src/components/dashboard/settings/settings.appInfoPanel.js @@ -19,7 +19,7 @@ class AppInfoPanel extends React.Component { for (let key in _ports) { _items.push( - + { key === 'komodod' ? 'KMD' : key }: { _ports[key] }
    ); diff --git a/react/src/components/dashboard/settings/settings.appSettingsPanel.js b/react/src/components/dashboard/settings/settings.appSettingsPanel.js index 7a9aa0213..760aa0f29 100644 --- a/react/src/components/dashboard/settings/settings.appSettingsPanel.js +++ b/react/src/components/dashboard/settings/settings.appSettingsPanel.js @@ -63,7 +63,7 @@ class AppSettingsPanel extends React.Component { this.state.appConfigSchema[key].type === 'folder' && _appSettings[key] && _appSettings[key].length) { - const _testLocation = window.require('electron').remote.getCurrentWindow().testLocation; + const _testLocation = mainWindow.testLocation; saveAfterPathCheck = true; _testLocation(_appSettings[key]) diff --git a/react/src/components/dashboard/settings/settings.daemonStdoutPanel.js b/react/src/components/dashboard/settings/settings.daemonStdoutPanel.js index 3fbad6345..1efcd039d 100644 --- a/react/src/components/dashboard/settings/settings.daemonStdoutPanel.js +++ b/react/src/components/dashboard/settings/settings.daemonStdoutPanel.js @@ -69,7 +69,7 @@ class DaemonStdoutPanel extends React.Component { this.updateSelectedCoin(event, i) } - autoFocus> - - - - { mainWindow.arch === 'x64' && - - } - + optionRenderer={ this.renderCoinOption } + valueRenderer={ this.renderCoinOption } + options={ addCoinOptionsCrypto().concat(addCoinOptionsAC()).concat(addCoinOptionsACFiat()) } />
    diff --git a/react/src/styles/index.scss b/react/src/styles/index.scss index db36c1089..c9f38b1e9 100644 --- a/react/src/styles/index.scss +++ b/react/src/styles/index.scss @@ -46,6 +46,7 @@ @import '../components/dashboard/spinner/spinner.scss'; @import '../components/toaster/toaster.scss'; @import '~react-table/react-table.css'; +@import '~react-select/dist/react-select.css'; /* dex */ @import 'dex/main.scss'; From 5cb936575c5ab5a8acb33ce9a9710ae027c4288b Mon Sep 17 00:00:00 2001 From: pbca26 Date: Tue, 12 Dec 2017 11:37:50 -0800 Subject: [PATCH 6/8] wrong var name fix --- react/src/components/addcoin/addcoin.js | 2 +- .../src/components/dashboard/walletsProgress/walletsProgress.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/react/src/components/addcoin/addcoin.js b/react/src/components/addcoin/addcoin.js index 3cd2a535d..e9adb62c7 100644 --- a/react/src/components/addcoin/addcoin.js +++ b/react/src/components/addcoin/addcoin.js @@ -219,8 +219,8 @@ class AddCoin extends React.Component { } updateSelectedMode(_value, index) { - const _selectedCoin = _coins[index].selectedCoin; let _coins = this.state.coins; + const _selectedCoin = _coins[index].selectedCoin; _coins[index] = { selectedCoin: _selectedCoin, diff --git a/react/src/components/dashboard/walletsProgress/walletsProgress.js b/react/src/components/dashboard/walletsProgress/walletsProgress.js index 25e7ec572..9c5b3d99e 100644 --- a/react/src/components/dashboard/walletsProgress/walletsProgress.js +++ b/react/src/components/dashboard/walletsProgress/walletsProgress.js @@ -29,6 +29,7 @@ class WalletsProgress extends React.Component { } componentWillMount() { + const _mainWindow = mainWindow; const _isWindows = mainWindow.isWindows; if (_isWindows) { From 6d2cdce202923b72faad59a77911edbfaf0617e2 Mon Sep 17 00:00:00 2001 From: pbca26 Date: Thu, 14 Dec 2017 21:20:14 +0300 Subject: [PATCH 7/8] close modals on esc or overlay click --- react/src/components/addcoin/addcoin.js | 6 ++- .../src/components/addcoin/addcoin.render.js | 6 +++ react/src/components/addcoin/addcoin.scss | 35 ------------- .../claimInterestModal.render.js | 6 +++ .../coindDownModal/coindDownModal.render.js | 6 +++ .../importKeyModal/importKeyModal.render.js | 6 +++ .../invoiceModal/invoiceModal.render.js | 6 +++ .../loginSettingsModal.render.js | 6 +++ .../dashboard/navbar/navbar.render.js | 5 ++ .../dashboard/qrModal/qrModal.render.js | 6 +++ .../walletsTxInfo/walletsTxInfo.render.js | 6 +++ .../zcparamsFetchModal.render.js | 6 +++ react/src/components/main/walletMain.js | 52 +++++++++++++++++++ react/src/components/overrides.scss | 46 ++++++++++++++++ react/src/store.js | 3 -- 15 files changed, 161 insertions(+), 40 deletions(-) diff --git a/react/src/components/addcoin/addcoin.js b/react/src/components/addcoin/addcoin.js index e9adb62c7..d2d2d6a9e 100644 --- a/react/src/components/addcoin/addcoin.js +++ b/react/src/components/addcoin/addcoin.js @@ -181,14 +181,15 @@ class AddCoin extends React.Component { src={ `/assets/images/cryptologo/${option.icon.toLowerCase()}.png` } alt={ option.label } width="30px" - height="30px"/> + height="30px" /> { option.label }
    ); } updateSelectedCoin(e, index) { - if (e.value && + if (e && + e.value && e.value.indexOf('|')) { const coin = e.value.split('|'); const defaultMode = coin[1]; @@ -242,6 +243,7 @@ class AddCoin extends React.Component { } handleKeydown(e) { + console.warn(e); if (e.key === 'Escape') { this.dismiss(); } diff --git a/react/src/components/addcoin/addcoin.render.js b/react/src/components/addcoin/addcoin.render.js index d2fcd6506..ed08b9b8a 100644 --- a/react/src/components/addcoin/addcoin.render.js +++ b/react/src/components/addcoin/addcoin.render.js @@ -7,7 +7,13 @@ const AddCoinRender = function() { return (
    this.handleKeydown(event) }>
    +
    +