From 2b0bf554e4989e1b0a26736ee40038aec11bee46 Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Thu, 12 May 2016 22:47:32 +0300 Subject: [PATCH 01/18] added tabs component Former-commit-id: 1fd3f86e235db34dde4ed04bc5535027d4a4cdfc --- .../main/res/drawable-hdpi/icon_tab_chats.png | Bin 0 -> 401 bytes .../res/drawable-hdpi/icon_tab_contacts.png | Bin 0 -> 746 bytes .../res/drawable-hdpi/icon_tab_discovery.png | Bin 0 -> 891 bytes .../main/res/drawable-mdpi/icon_tab_chats.png | Bin 0 -> 307 bytes .../res/drawable-mdpi/icon_tab_contacts.png | Bin 0 -> 525 bytes .../res/drawable-mdpi/icon_tab_discovery.png | Bin 0 -> 617 bytes .../res/drawable-xhdpi/icon_tab_chats.png | Bin 0 -> 442 bytes .../res/drawable-xhdpi/icon_tab_contacts.png | Bin 0 -> 994 bytes .../res/drawable-xhdpi/icon_tab_discovery.png | Bin 0 -> 1226 bytes .../res/drawable-xxhdpi/icon_tab_chats.png | Bin 0 -> 613 bytes .../res/drawable-xxhdpi/icon_tab_contacts.png | Bin 0 -> 1394 bytes .../drawable-xxhdpi/icon_tab_discovery.png | Bin 0 -> 1512 bytes .../res/drawable-xxxhdpi/icon_tab_chats.png | Bin 0 -> 893 bytes .../drawable-xxxhdpi/icon_tab_contacts.png | Bin 0 -> 1892 bytes .../drawable-xxxhdpi/icon_tab_discovery.png | Bin 0 -> 2016 bytes src/syng_im/components/chats/chats_list.cljs | 20 ++++--- .../components/contact_list/contact_list.cljs | 4 +- .../components/discovery/discovery.cljs | 21 ++++---- src/syng_im/components/main-tabs.cljs | 30 +++++++++++ src/syng_im/components/tabs/styles.cljs | 49 ++++++++++++++++++ src/syng_im/components/tabs/tab.cljs | 20 +++++++ src/syng_im/components/tabs/tabs.cljs | 23 ++++++++ 22 files changed, 146 insertions(+), 21 deletions(-) create mode 100644 android/app/src/main/res/drawable-hdpi/icon_tab_chats.png create mode 100644 android/app/src/main/res/drawable-hdpi/icon_tab_contacts.png create mode 100644 android/app/src/main/res/drawable-hdpi/icon_tab_discovery.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_tab_chats.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_tab_contacts.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_tab_discovery.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_tab_chats.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_tab_contacts.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_tab_discovery.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_tab_chats.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_tab_contacts.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_tab_discovery.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_tab_chats.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_tab_contacts.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_tab_discovery.png create mode 100644 src/syng_im/components/main-tabs.cljs create mode 100644 src/syng_im/components/tabs/styles.cljs create mode 100644 src/syng_im/components/tabs/tab.cljs create mode 100644 src/syng_im/components/tabs/tabs.cljs diff --git a/android/app/src/main/res/drawable-hdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-hdpi/icon_tab_chats.png new file mode 100644 index 0000000000000000000000000000000000000000..c6792ef46c8aa0bb341a471c797c88a343dcdd9d GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBSc;uILpXq-h9ji|$mcBZh%9Dc z5IGFOjG_g;PC!A)64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<_&`8-`5 zLn2z=Uh~a5`*KDr`{{vB`yIe~d%^hW8 zINDw=V_V%DFXovp_Ss2nW=%``AHk{n#QZf(1Rk0-yRJ6TE|W{}o5}bufniZ&_Q6y} z6;X#EMitXtr2(21d*qove5^ch>tCA7g&eD-ogJNv6&aSUtfz(GJ*W*O482b_>(mPqs@}zWRG9WX-2qedFgVO|+%v zSBmG~^qtVX=eGgdgb)T#RtPcSBWKEn7j5wozyEC7bNTWFpdUe-HVDK?`y85}Sb4q9e09-wsUjP6A literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-hdpi/icon_tab_contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..44ef070f465c57050e984a1d16bb6a9d2862fb09 GIT binary patch literal 746 zcmV?SXyz*1rVT&b-}gQdcL ztlc`+PF-_-UVr$NMC*tr1g$q!EV~qAOv`!v|7D*vk)|x|SUkMj%h1hkZlo=o)Y;GD z)|>pS`E37a@bSxGq^=)Y=zh-O(b!dN>*5~nqzr?7hQYor#%?>j`+N|3t%aJhd^W}O zcsi8K-`JKgJ)S0?O|?(x!JS?t&d1FOBCQ;46S@_nYsbwIO6YrxCK)$JD4|bZ57D?= zFQD4W(KeydPMwwY8lE5B%JY?#^%|v}dZ_r&WnV12eA}u2lYOX4$bYk%>+`;N5IT7b zszy{dle|L|M0L|NjjVQBB%oZmukx34p8x;=07*qoM6N<$g8zA3B>(^b literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/icon_tab_discovery.png b/android/app/src/main/res/drawable-hdpi/icon_tab_discovery.png new file mode 100644 index 0000000000000000000000000000000000000000..1166cab6f6c310a4665ce573ccdddd14daccf27f GIT binary patch literal 891 zcmV->1BCpEP)y&9LdK$vW)%pHuhO1`<(`M|ZK(8}gzuZHpgfRVPy zJaDYSH)fZTtPit0@Mv7#>VOOYjA&fmn%#ltNulsnG10bRY6M|2d{s=;y}BE+rBq>@ z2){ZeV}TiO?q;8*hj^_UGWND5z+CiRy3V`=A{vdS3e)#OkkHz-rWtAuw6Kv0s2-&R z_uIkKF$oCuDToeuF&tFj@A2UC_Y1extJ6xl$MO`eY!4ndIh^UOJkfRI$oSs)iLr0`q zJ|o0Xzt>Sl(;0;e!5$(COL$1GToVm?9m`}&6&PZ<9{>zW&Sf4m98?_3oEC+L3xK%} z<%KGcIb==<|Ij9Rsg?t~Ce)|YP3=Y)Yz~<)%sB}_R-{gJ;Q8J$82FPdL(|27AOKkz z677NU-fa#0|D)-QOsRsiqK?yI1({N%Ss6g0Jz1;jyQ)X2!sXWC@A2U1@ub^^)y?zb>#fPI2h@U$uQD6e=u%+RVTDPgIkq+a{!Jz zpmVH}Z_a+Cezdu+&Ihhl_{Q4WQ;c+@Q!DVlTsBzwXRc%H{4*C;cG`WV_ZO`gO91aL RA^rdW002ovPDHLkV1n=?iQ)hN literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-mdpi/icon_tab_chats.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9d11dbb0dc1aa8bd8de78e46dc9df29ce93bd7 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4qAg>%FLq!S`Gd_1Dw=Dxnp*rw|1?8L{N z{wdvu8Ilj4N&lbuq=JpD?coF;cU_6C4Nf2CC#pv!e&4^*-gi~wtTKh44ZqryBORm< pOG*F%SDIb!kN^Menb#UHJk_0$e9&a)Q=r=!JYD@<);T3K0RTA_ZY2N! literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-mdpi/icon_tab_contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6be3d17f46bd8fb9c02a0398b08db720c254eb GIT binary patch literal 525 zcmV+o0`mQdP)DC6&g&MrxM>@nhi3rsfZ*@4DMd*8u=6Hb$*JKyT=Ymg=eu{OWWET7-PX(#Z`R>}n`gyFwF1 zWRT0m=HN4F5rSMMCR#2wn6>4vIcbBS5*oDFc&VJUL9IT3GvNzyXTnjd4}=E7Q`8%J zC{?@59#gTw%;fH|FH^dp(1-l%4vfSaj`lPh8X6K?^QE1>i&x9R%bNqMGxcSV^XvBF z1OXiHZ{jQ~_XggZHX6;*k2&8Kous2ua8d35U9^X%p)};TTHhfznj^gTrYjk88^Ql! zKQV=am?6QzK}tEpx~30=G!Ko P00000NkvXXu0mjfUANnr literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/icon_tab_discovery.png b/android/app/src/main/res/drawable-mdpi/icon_tab_discovery.png new file mode 100644 index 0000000000000000000000000000000000000000..6b726371f7e244f75a97edb3d9b185b9298003b3 GIT binary patch literal 617 zcmV-v0+#)WP)|WK~zYIy_UaD8$l3p_49sdULy zk2cZP1K!oH-(b{NpkNWcPZROWha1_ms8K~9_G;b^M%AYf2Pj}veXr*2M2({eLeJ~i zQ({9S{@Yo%<<`4CvLktP-e{`D53|+=U%X$Pm)U|n0IAlKfSoMy;^dB zqHWiDKFRCs{Fwd98>_4P6xF}-pNta7r4kd@E?a$zz9}io4wjePJ82ox(}tUlH3C%F zxMEpNPxk&-yN@5=Cqty62)be{E1A0&tfvh>uX}ty@7mM>P8{ID2o@LSIK8;#%F|r7 z`rLH%BRn6`c=ke5!LTsZ8H)o_IoM9O6+oAl6`(mo^=6k$6~bnBw24OiGK^28DbR>t z9!|GW9UN|C&qQSRiHB$r*^N%MXCImWf9OY<#c#`BAo|FT_xb#{00000NkvXXu0mjf DFQpAT literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-xhdpi/icon_tab_chats.png new file mode 100644 index 0000000000000000000000000000000000000000..7c188096adab636ad2e38f2c3da23031d45f2f72 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmSQK*5Dp-y;YjHK@;M7UB8wRq zq}PKmW1Q4P8K9tKiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}?=AJH& zAsLNtXBzq)b`WsAFC`N6ps9%|>Rp0)%t6`o1+1K%Qc+7ftjZUB)|_L##FvYUE7)S% zg-Zf1ISI@s&PfT1|`2MGwW8>FtdAqNb?(6)e$j5bN z`fB;LrE~LzM1Ur($~#{fTK#F!8{7LT65yN)&?8N)JcQFL^u z$oN!Y47dlxLI|`KD!{~p-%^tb3cCUXWNfOVSll~LL+cz{@4Wz-QR9d;x^5hd;Hmddt7Mba*o z>wGfdlJ1XjHW}gEHxU3{y{)lPtdU!-P%L>i-KAvw_y6?pafc(o@KBtQOcxPXzBs1l zDYFY(%rBL(;uLUgOd>$`mu@chb{;q`;tIe1e2T%IPNwHJt%z_e%)#(b{LtX{a)*AM5dspctaxfuxWb%Mr%NTOXs6}-y0>F=pdPJ ziAN89C*^9LV#%Xe+F^OU%0FvWqly$*zz=;WvephmqmzC3q(uIW|Kn+(LjL!^6+U3kK~!jg-I~u&8%Gq!zi+&2Ao!5T753Uh6svzilM_-8s8{eM z97=LYf)t6il0m3P)UyRh4V5CHBvR8{!Ueci9FRDLO8o~~C<^x4s8%=_Fy3We54(1- zW93G454%Y_Ey~_6+ zC7vbbIRGIqlQy8pL}|5`7SazQ$8K(PY{0}S0)y}MM-up%fT$;#Enpxgfcb-4+VeN} zaPH(DM+W@x;$2KJl{El&{EBqQj;WZ*rw?yuTXk${z|6DUT^76sKx>yehv+0Jx%edd zwpl09>|$y~pOk{PaP{H=K$C*EQY-povrd-vRVvj!$s5wLfgPfa`kXo{(< zO{^kt@y8ki2H)$CaCKXy7w*^^t5id1?p40uIF)~Q>LJxG7|5x8;;YINyXpa>#Iv8e zcmN?464*;Q{LSq1+SZ%A(X#@dU zSVbZd#Bfx_&Hey>+3=J_g9VKPcuA?ncYWL+_z&*$`IhvkgrNaTY$6)O&_ED9Dpjxl z_0K7O+dT3*{0SYOf1${bI!Y|tBK~G5fMNUJO+qE)Ni86bafU@K0XHXtjMxwqkxaU&da}z+S$LqoSjiZY`0ZZABD~ zP3{kzz+*C3AOB|tWBoo@%t)>1Yha9f8Rf^ZFpiGTEy4LR z^n&603F`>L`qGq^w9f;)0gxvHyyo+MA<652eI_=_ybhq)6(!y%mQCIOYy+03;{_&4 zcUO~hm?&K-h*VPvwU-tc$aPPaGZ@IJy|hqiR}Dx%h#U)GzB{sAK7%6P=U-;6aIFj7 o7rC~d8q{-bKlW%uH$S)eA5^*kJhc&9-2eap07*qoM6N<$f;qM*;{X5v literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-xxhdpi/icon_tab_chats.png new file mode 100644 index 0000000000000000000000000000000000000000..82dbb8ff905cd315118d659e4bdb04c99ca8a264 GIT binary patch literal 613 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!EX7WqAsj$Z!;#Vf4nJ zXtsecqtcuEJwQRp64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<_&A9=bs zhE&XXduOj#vZGAfNA*Zi&&^`dtYSJkOqsz;zF7rDMnqI{R^ z&`O;mo_kNvsy$;W<{Zsg`^FkaBkEWsRpprAc`&g}Ph z{mZ^a%rvRAEsm*7_pOOM`pR^FHT%wVg^7(WY(kPADYzM1KHp@PcG!P;QT2}V@8fqf z+_ASY-dUYwGI#Tu7jw#s&#&)(l3c&7&cMR%!HT`%zkaWYFxXT3?Ed~~-_KxOiSmaFl>DqHsaDZaJu z2fy^GZ7s$t>MTAaE~t8RpuOQ$H?z=+dlmw$Mtm%dJ)76DoUoX^m(l3lZL@}+;A>nb fEEdi>*7=?3oHgTe~DWM4fPk{Ek literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-xxhdpi/icon_tab_contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..01e00d5632bdda3781c0c7b7594cc9d04b54812d GIT binary patch literal 1394 zcmV-&1&#WNP)KOa9Z#6SqI8UjhArmcvIIlK2uoP9#8bBnkvcFjhb&}hJ4Wh+1Ve^4Dg|nZsHjacAQNzTg#Zo@U;Dbl^(Ahw zu_@==YwG(+2=V&;-|wD#&$<6Gzbl##u3Un`qcId|4o6UCvJn9G~jb{B)QV*w0X~&raVVZF6Mxq zk)dG1yu|L|$jPP?!wIgt50;yOSN#8HtCNxhE((lwjw9zN9-v2HEC3yH(=9Mo#}2va zas(Yumj@f4tpb&T_C_yljb7RsytFm?09ag0u(+u@b&=;zv zHx$4vj{f}GB|q0L`2k4jFcH~dG7=|cgD1-cwbpz2`erRH^~EjN-2(c%s_DG!=Z7a- zENy6tGyFF>&YwDNbW{-@Xee4vHZApD!UGN5=%`YVS$-@N)LQRl;CgM&OR8Ah0tT)Z zKl)@~i6FOtuWp`BPIjzsB*iKQOJ1fgR86bIv))qgr7u)1E#7e`7Zj)z^o9b`QZK7OIbWKxIrby{VY}F_i6yMXCjKrnKos7gS zDWq94i%mp!q}FkkH#8<9JJRAEhb4kiI{f%#OUk8|(&2kav5LX6b3(m=N&E#R@*C^U`$Q zP1AV~O|>4*`A>Fk-tOzHZY5cLlVtTxioZ8C{(N;r=}w_7ioh2Dj`8KbCD+K#ZrR!zI~-pllZ>QizRt)YLF&q z_dw_2_-hhL%l7~dNhH%e9DmL3fxHtX^(Gx%)p#_yiEe`EQi_J$5 z7@OE+eLE#PbY9lCQ;bb)Dk=UeDR(?u*yoSvzSMF@F03ebD60qQI{fy0kC~TyXTD$- zL*f67={hC9_jL?0fzjl{Avd#*pyQbp7%gHPax)_^T2dtK&ZGoM0@EVXTxi(tY)X*f zk)hyVs^velT-jXyRoZW@WY0>qL z!Y#Vsa3u8r-%%d3TN2|~d)}7=dAi`4IBf#qA1b)i9}_s)Y5)KL07*qoM6N<$g3dgO Ab^rhX literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_tab_discovery.png b/android/app/src/main/res/drawable-xxhdpi/icon_tab_discovery.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc25d2ab39a7f287dcf68a96cd9da448a46e376 GIT binary patch literal 1512 zcmVP)sFTo&mX-(}ioxcTTv}RC z4AP6_)Sl)LXz4CZ4c?G7Ly(d2FkkFfU^q9Ql!D%==AX3 znsMEKv-{@l?7ANqSl6BRe(%fg_vZckO~`Q^bP`Y4qrfm=$m>eMXMku+{1eibwG6`H#UWs5I_z@x2 zW6Lyhsw+?`P&{FWfN9_x;2mWJS4R?<1r{ySP}V4A0>u;dhrqYMbtMJX&N?t-nZ_?F z3aeY7c*1@km;*jhVUR*rf%}$e{8>*SH479^*kRxya1RL8V}y@5z&!B4GL7R}3aCk- zc*1@YSOCUrsk8yC0Cz0Y_}A-=o&}00?011>;F{OU8q9Oxwq+WBd$}p><;U@a{V}jc z^N9n(<~7-ds;OF_c)~Ujt{U@bSdfSTE3z$BQB{aZ)mMOy+HDIIN5Hsc8b4L~VMT#t zpR-1DdrmPjzz3E3q_QCdd zgm9VRYAUUK8_dlVjTERbTn781#JasLH*M}@eXig|c!~jVPBLi=6bL7IA zaPi7v&f&qMG{^q#oL}!m93;@j&5;YdceShTa<+D}ev1Pz97dd~&_Xx_1HDltW%=Cy z*4^QGoKp%-9W=-g(}F7R0Z8fdAi{`4lD?y=|H&L2kvTY0QdSjg zhY_boeMi+3OsDq%wibc9A|Z?(H6Em~{{bnG?;$qO8!bC4_kzYJ80ZSIp?)>tb(nLo z_w;*^?*ggnpfycU-PoOooebYlF+n}dIc)7_`R%X&6j@a@8~HWqf2co2peR=_NBH{F z%bxDZ92}9_$&yOv*xbot@8xuR4!{e`G~UjyC@ukC_)$xx$NRA(=2n|hkkn3A=QyVv zO8~wLRM`LI!zGo@v6;@YwVTy7@$||mfu10?I+X8h#4dL5Ecvq0;o_BjgeIr9o*x09 zHO{6$@q=X=pTp^$)uqPR5=c(8a0~Ppv2lOiNg}iWTms3{46}`}C}7OG6Y~n!gBH=a zM;1WV5gMFuN+5Z%YDT9;0b`~xTk*__qCBIws?DU}uv#ojvDA|5eZsh8|F4DXS zb{T}{R3#3y)50s_d2e1;aD(O=0<0jOR-VLx8U%uqr`sgrWhOx$aXSbbCu@1@0<>Rl zQjzxSaVntfe2_F~47fvMRwk3O?lD#3K>HP46=}cZtpdIaR7kVECh&iY%M+;K@21)S O0000_ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-xxxhdpi/icon_tab_chats.png new file mode 100644 index 0000000000000000000000000000000000000000..c434e665881c13c152957e2ded26dcd57626d22e GIT binary patch literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ zn8$)Jqhx~{kij5X;u=vBoS#-wo>-L1P+nfHmzkGcoSayYs+V7sKKq@G6axd(FHaZ8 zkcv5P@9fW(DwH|)@p!kIAg9yHW>x#PT`3%m9t$Q%GB2!mn;X0<#b zO!-=sxKx|Fz3T+noey?NEH03}f4+PCvr;{Mk0R&oZ6E&yr!ybm zY_Mgh^q67AaE?JH^wiJpBM)DmWow9M*mURhENfea+hTHcpSJ#ak;*tHqGHEej^p!K z?|z>7N$fY*v$;$YG#O@+OhjJ#av;X6GfA=cY7AGlelSDB>f46vb|;(MaxST!ymQ|F zkVhZB95XZGaLCkdZoVtJWKw5(zodUo$m`lG=h#2|UQ{^${f}L0Oezd}Zr3-S{i^DJ ze7m0ek3WC6KQ|Zr{`0cLPacijRGWAkhMaZ!3%5+2Is4~j7QP9m)e1N4e)M|}(8MR3 z-pM-xO;IaoNK$-Taej{4RG)<98{Smi@k^|H_VcLIEW7)@4;WVOymIFGx~F2jGLMg( z-r8yl66>#D)moZ&=lSl7;)a_JFs{oxzHpxO_n&!8>^t7ERWRSJRz7a=u_!n3e7UfN z!(!Vb6_5UFpR7n)d~;v1?Yf)$W>?lNwp{|2+-~l;_1^c|I3V#QM)lq2yAnSI*3IR= zuuG=WZeOXT)7u&Y^Uup8D?Wcays^{q>^FhK)za%fcSmfPBcE3L`{wcM^7S?L?w!AD z)Q`<;v+Mf(_|Xl!zG*jKbW4yPC3ticl!`RG_F=53V(1f5sFG!fXUGW$rjmyLACCQt z(A;ljRuEXMeIUPKTK=IP#w|6$X&eil&VFJHP;-|?QNZ~N-60J92%r>mdK II;Vst06lhy2><{9 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-xxxhdpi/icon_tab_contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..faa0af93ceadb6a393102d65ca9e58e793929f7e GIT binary patch literal 1892 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 Date: Thu, 12 May 2016 23:46:17 +0300 Subject: [PATCH 02/18] fixed discovery tag navigation Former-commit-id: 897ee3dcd672dd64c339155e2c009b5767a0b474 --- .../components/discovery/discovery.cljs | 3 +- .../discovery/discovery_popular.cljs | 4 +- .../discovery/discovery_popular_list.cljs | 4 +- .../components/discovery/discovery_tag.cljs | 38 +++---- .../components/discovery/handlers.cljs | 4 +- src/syng_im/components/discovery/styles.cljs | 101 +++++++++--------- 6 files changed, 77 insertions(+), 77 deletions(-) diff --git a/src/syng_im/components/discovery/discovery.cljs b/src/syng_im/components/discovery/discovery.cljs index 8d6ea4ad4d..3cc2e65373 100644 --- a/src/syng_im/components/discovery/discovery.cljs +++ b/src/syng_im/components/discovery/discovery.cljs @@ -61,7 +61,6 @@ :style {:width 16 :height 12}} :handler create-fake-discovery} - :title "Add Participants" :custom-content [title-content @showSearch] :action {:image {:source {:uri "icon_search"} :style {:width 17 @@ -73,7 +72,7 @@ [scroll-view {:style {}} [view {:style st/section-spacing} [text {:style st/discovery-subtitle} "Popular tags"]] - [discovery-popular navigator] + [discovery-popular] [view {:style st/section-spacing} [text {:style st/discovery-subtitle} "Recent"]] [discovery-recent]] diff --git a/src/syng_im/components/discovery/discovery_popular.cljs b/src/syng_im/components/discovery/discovery_popular.cljs index df33467899..a829a7ae12 100644 --- a/src/syng_im/components/discovery/discovery_popular.cljs +++ b/src/syng_im/components/discovery/discovery_popular.cljs @@ -12,12 +12,12 @@ (defn page-width [] (.-width (.get (.. js/React -Dimensions) "window"))) -(defn discovery-popular [navigator] +(defn discovery-popular [] (let [popular-tags (subscribe [:get-popular-tags 3])] (log/debug "Got popular tags: " @popular-tags) (if (> (count @popular-tags) 0) [carousel {:pageStyle st/carousel-page-style :sneak 20} (for [tag @popular-tags] - (discovery-popular-list (.-name tag) (.-count tag) navigator))] + (discovery-popular-list (.-name tag) (.-count tag)))] [text "None"]))) \ No newline at end of file diff --git a/src/syng_im/components/discovery/discovery_popular_list.cljs b/src/syng_im/components/discovery/discovery_popular_list.cljs index 0291a1bb82..428e647d8f 100644 --- a/src/syng_im/components/discovery/discovery_popular_list.cljs +++ b/src/syng_im/components/discovery/discovery_popular_list.cljs @@ -26,12 +26,12 @@ :key rowID}])] elem)) -(defn discovery-popular-list [tag count navigator] +(defn discovery-popular-list [tag count] (let [discoveries (subscribe [:get-discoveries-by-tag tag 3])] [view {:style st/popular-list-container} [view st/row [view st/tag-name-container - [touchable-highlight {:onPress #(dispatch [:show-discovery-tag tag navigator :push])} + [touchable-highlight {:onPress #(dispatch [:show-discovery-tag tag])} [text {:style st/tag-name} (str " #" (name tag))]]] [view {:style st/tag-count-container} diff --git a/src/syng_im/components/discovery/discovery_tag.cljs b/src/syng_im/components/discovery/discovery_tag.cljs index f8a7fa88a8..cf6d76ffa7 100644 --- a/src/syng_im/components/discovery/discovery_tag.cljs +++ b/src/syng_im/components/discovery/discovery_tag.cljs @@ -19,8 +19,7 @@ (if row (let [elem (discovery-popular-list-item row)] elem) - (r/as-element [text "null"]) - )) + (r/as-element [text "null"]))) (defn render-separator [sectionID, rowID, adjacentRowHighlighted] (let [elem (r/as-element [view {:style st/row-separator @@ -29,8 +28,9 @@ (defn title-content [tag] [view {:style st/tag-title-container} - [text {:style st/tag-title} - (str " #" tag)]]) + [view {:style st/tag-container} + [text {:style st/tag-title} + (str " #" tag)]]]) (defn discovery-tag [{:keys [tag navigator]}] (let [tag (subscribe [:get-current-tag]) @@ -39,21 +39,17 @@ (fn [] (let [items @discoveries datasource (to-realm-datasource items)] - [view {:style st/discovery-tag-container} - [toolbar {:navigator navigator - :nav-action {:image {:source {:uri "icon_back"} - :style st/icon-back} - :handler (fn [] (nav-pop navigator))} - :title "Add Participants" - :content (title-content @tag) - :action {:image {:source {:uri "icon_search"} - :style st/icon-search} - :handler (fn [] - ())}}] + [view {:style st/discovery-tag-container} + [toolbar {:navigator navigator + :custom-content [title-content @tag] + :action {:image {:source {:uri "icon_search"} + :style st/icon-search} + :handler (fn [] + ())}}] - [list-view {:dataSource datasource - :enableEmptySections true - :renderRow render-row - :renderSeparator render-separator - :style st/recent-list}] - ])))) \ No newline at end of file + [list-view {:dataSource datasource + :enableEmptySections true + :renderRow render-row + :renderSeparator render-separator + :style st/recent-list}] + ])))) \ No newline at end of file diff --git a/src/syng_im/components/discovery/handlers.cljs b/src/syng_im/components/discovery/handlers.cljs index 44d24c99d9..0139316849 100644 --- a/src/syng_im/components/discovery/handlers.cljs +++ b/src/syng_im/components/discovery/handlers.cljs @@ -37,8 +37,8 @@ db))) (register-handler :show-discovery-tag - (fn [db [action tag navigator nav-type]] + (fn [db [action tag]] (log/debug action "setting current tag: " tag) (let [db (set-current-tag db tag)] - (dispatch [:navigate-to navigator {:view-id :discovery-tag} nav-type]) + (dispatch [:navigate-to :discovery-tag]) db))) \ No newline at end of file diff --git a/src/syng_im/components/discovery/styles.cljs b/src/syng_im/components/discovery/styles.cljs index 0044f86c94..465d3a25ba 100644 --- a/src/syng_im/components/discovery/styles.cljs +++ b/src/syng_im/components/discovery/styles.cljs @@ -39,14 +39,14 @@ (def discovery-title {:color "#000000de" - :alignSelf "center" + :alignSelf "center" :textAlign "center" :fontFamily "sans-serif" :fontSize 16}) (def discovery-toolbar {:backgroundColor "#eef2f5" - :elevation 0}) + :elevation 0}) (def discovery-subtitle {:color "#8f838c93" @@ -71,86 +71,86 @@ ;; discovery_populat_list.cljs (def tag-name - {:color "#7099e6" - :fontFamily "sans-serif-medium" - :fontSize 14 - :paddingRight 5 - :paddingBottom 2 - :alignItems "center" + {:color "#7099e6" + :fontFamily "sans-serif-medium" + :fontSize 14 + :paddingRight 5 + :paddingBottom 2 + :alignItems "center" :justifyContent "center"}) (def tag-name-container - {:flexDirection "column" + {:flexDirection "column" :backgroundColor "#eef2f5" - :borderRadius 5 - :padding 4}) + :borderRadius 5 + :padding 4}) (def tag-count - {:color "#838c93" - :fontFamily "sans-serif" - :fontSize 12 - :paddingRight 5 - :paddingBottom 2 - :alignItems "center" + {:color "#838c93" + :fontFamily "sans-serif" + :fontSize 12 + :paddingRight 5 + :paddingBottom 2 + :alignItems "center" :justifyContent "center"}) (def tag-count-container - {:flex 0.2 + {:flex 0.2 :flexDirection "column" - :alignItems "flex-end" - :paddingTop 10 - :paddingRight 9}) + :alignItems "flex-end" + :paddingTop 10 + :paddingRight 9}) (def popular-list-container - {:flex 1 + {:flex 1 :backgroundColor "white" - :paddingLeft 10 - :paddingTop 16}) + :paddingLeft 10 + :paddingTop 16}) (def popular-list {:backgroundColor "white" - :paddingTop 13}) + :paddingTop 13}) ;; discover_popular_list_item.cjls (def popular-list-item {:flexDirection "row" - :paddingTop 10 + :paddingTop 10 :paddingBottom 10}) (def popular-list-item-status - {:color "black" + {:color "black" :fontFamily "sans-serif" :lineHeight 22 - :fontSize 14}) + :fontSize 14}) (def popular-list-item-name - {:color "black" + {:color "black" :fontFamily "sans-serif-medium" - :fontSize 14 + :fontSize 14 :lineHeight 24}) (def popular-list-item-name-container - {:flex 0.8 + {:flex 0.8 :flexDirection "column"}) (def popular-list-item-avatar-container - {:flex 0.2 + {:flex 0.2 :flexDirection "column" - :alignItems "center" - :paddingTop 5}) + :alignItems "center" + :paddingTop 5}) (def popular-list-item-avatar - {:resizeMode "contain" + {:resizeMode "contain" :borderRadius 150 - :width 40 - :height 40}) + :width 40 + :height 40}) ;; discovery_recent (def recent-list {:backgroundColor "white" - :paddingLeft 15}) + :paddingLeft 15}) ;; discovery_tag @@ -158,22 +158,27 @@ {:flex 1 :backgroundColor "#eef2f5"}) +(def tag-title-container + {:flex 1 + :alignItems "center" + :justifyContent "center"}) + (def tag-title - {:color "#7099e6" - :fontFamily "sans-serif-medium" - :fontSize 14 - :paddingRight 5 + {:color "#7099e6" + :fontFamily "sans-serif-medium" + :fontSize 14 + :paddingRight 5 :paddingBottom 2}) -(def tag-title-container +(def tag-container {:backgroundColor "#eef2f5" - :flexWrap :wrap - :borderRadius 5 - :padding 4}) + :flexWrap :wrap + :borderRadius 5 + :padding 4}) (def icon-back - {:width 8 - :height 14}) + {:width 8 + :height 14}) (def icon-search {:width 17 From a03b1a03575a6da6cec68cb705d1a1d89465ea78 Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Tue, 17 May 2016 17:03:21 +0300 Subject: [PATCH 03/18] use the new defview Former-commit-id: dfc772d0cd61f60a245b8c1c624228fae2a5eac9 --- src/syng_im/chats_list/screen.cljs | 8 ++++-- src/syng_im/components/main-tabs.cljs | 40 +++++++++++++-------------- src/syng_im/components/tabs/tab.cljs | 15 +++++----- src/syng_im/components/tabs/tabs.cljs | 15 +++++----- src/syng_im/contacts/screen.cljs | 4 ++- src/syng_im/discovery/screen.cljs | 4 ++- 6 files changed, 46 insertions(+), 40 deletions(-) diff --git a/src/syng_im/chats_list/screen.cljs b/src/syng_im/chats_list/screen.cljs index 55c4457540..023422efe4 100644 --- a/src/syng_im/chats_list/screen.cljs +++ b/src/syng_im/chats_list/screen.cljs @@ -14,6 +14,7 @@ [syng-im.components.drawer.view :refer [drawer-view open-drawer]] [syng-im.components.styles :refer [color-blue]] [syng-im.components.toolbar :refer [toolbar]] + [syng-im.components.main-tabs :refer [main-tabs]] [syng-im.components.icons.ionicons :refer [icon]] [syng-im.chats-list.styles :as st])) @@ -37,7 +38,9 @@ :renderRow (fn [row _ _] (list-item [chat-list-item row])) :style st/list-container}] - [action-button {:buttonColor color-blue} + [action-button {:buttonColor color-blue + :offsetY 72 + :offsetX 16} [action-button-item {:title "New Chat" :buttonColor :#9b59b6 @@ -49,4 +52,5 @@ :buttonColor :#1abc9c :onPress #(dispatch [:show-group-new])} [icon {:name :person-stalker - :style st/person-stalker-icon}]]]]]))) + :style st/person-stalker-icon}]]] + [main-tabs]]]))) diff --git a/src/syng_im/components/main-tabs.cljs b/src/syng_im/components/main-tabs.cljs index 479ba57511..7116b6a3fe 100644 --- a/src/syng_im/components/main-tabs.cljs +++ b/src/syng_im/components/main-tabs.cljs @@ -1,4 +1,5 @@ (ns syng-im.components.main-tabs + (:require-macros [syng-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] [syng-im.components.react :refer [view text-input @@ -8,23 +9,22 @@ [syng-im.components.tabs.tabs :refer [tabs]] [syng-im.utils.logging :as log])) -(defn main-tabs [] - (let [view-id (subscribe [:view-id])] - (fn [] - [tabs {:selected-index (case @view-id - :chat-list 0 - :discovery 1 - :contact-list 2 - 0) - :tab-list [{:handler #(dispatch [:navigate-to - :chat-list]) - :title "Chats" - :icon "icon_tab_chats"} - {:handler #(dispatch [:navigate-to - :discovery]) - :title "Discover" - :icon "icon_tab_discovery"} - {:handler #(dispatch [:navigate-to - :contact-list]) - :title "Contacts" - :icon "icon_tab_contacts"}]}]))) +(defview main-tabs [] + [view-id [:get :view-id]] + [tabs {:selected-index (case view-id + :chat-list 0 + :discovery 1 + :contact-list 2 + 0) + :tab-list [{:handler #(dispatch [:navigate-to + :chat-list]) + :title "Chats" + :icon "icon_tab_chats"} + {:handler #(dispatch [:navigate-to + :discovery]) + :title "Discover" + :icon "icon_tab_discovery"} + {:handler #(dispatch [:navigate-to + :contact-list]) + :title "Contacts" + :icon "icon_tab_contacts"}]}]) diff --git a/src/syng_im/components/tabs/tab.cljs b/src/syng_im/components/tabs/tab.cljs index af9aeab37c..bdc4043a13 100644 --- a/src/syng_im/components/tabs/tab.cljs +++ b/src/syng_im/components/tabs/tab.cljs @@ -1,4 +1,5 @@ (ns syng-im.components.tabs.tab + (:require-macros [syng-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] [syng-im.components.react :refer [view text-input @@ -8,13 +9,11 @@ [reagent.core :as r] [syng-im.components.tabs.styles :as st])) -(defn tab [{:keys [handler title icon selected-index index]}] - (fn [{:keys [handler title icon selected-index index]}] - [touchable-highlight {:style st/tab - :onPress #(do (reset! selected-index index) - (handler))} - [view {:style st/tab-container} +(defview tab [{:keys [handler title icon selected-index index]}] + [touchable-highlight {:style st/tab + :onPress handler} + [view {:style st/tab-container} [image {:source {:uri icon} :style st/tab-icon}] - (when (= @selected-index index) - [text {:style st/tab-title} title])]])) + (when (= selected-index index) + [text {:style st/tab-title} title])]]) diff --git a/src/syng_im/components/tabs/tabs.cljs b/src/syng_im/components/tabs/tabs.cljs index d9fd94be55..257cd60260 100644 --- a/src/syng_im/components/tabs/tabs.cljs +++ b/src/syng_im/components/tabs/tabs.cljs @@ -1,4 +1,5 @@ (ns syng-im.components.tabs.tabs + (:require-macros [syng-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] [syng-im.components.react :refer [view text-input @@ -10,14 +11,12 @@ [syng-im.components.tabs.tab :refer [tab]])) (defn create-tab [index data selected-index] - (let [data (merge data {:key index - :index index + (let [data (merge data {:key index + :index index :selected-index selected-index})] [tab data])) -(defn tabs [{:keys [style tab-list selected-index]}] - (let [selected-index (r/atom selected-index)] - (fn [{:keys [style tab-list]}] - (let [style (merge st/tabs style)] - [view {:style style} - (doall (map-indexed #(create-tab %1 %2 selected-index) tab-list))])))) +(defview tabs [{:keys [style tab-list selected-index]}] + (let [style (merge st/tabs style)] + [view {:style style} + (doall (map-indexed #(create-tab %1 %2 selected-index) tab-list))])) diff --git a/src/syng_im/contacts/screen.cljs b/src/syng_im/contacts/screen.cljs index 3e16b78380..74f9ec23cf 100644 --- a/src/syng_im/contacts/screen.cljs +++ b/src/syng_im/contacts/screen.cljs @@ -9,6 +9,7 @@ [syng-im.contacts.views.contact :refer [contact-view]] [syng-im.components.styles :refer [toolbar-background2]] [syng-im.components.toolbar :refer [toolbar]] + [syng-im.components.main-tabs :refer [main-tabs]] [syng-im.contacts.styles :as st] [syng-im.utils.listview :as lw])) @@ -32,4 +33,5 @@ [list-view {:dataSource (lw/to-datasource contacts) :enableEmptySections true :renderRow render-row - :style st/contacts-list}])]) + :style st/contacts-list}]) + [main-tabs]]) diff --git a/src/syng_im/discovery/screen.cljs b/src/syng_im/discovery/screen.cljs index 8f51f391ac..c7f4948c1f 100644 --- a/src/syng_im/discovery/screen.cljs +++ b/src/syng_im/discovery/screen.cljs @@ -9,6 +9,7 @@ [syng-im.components.toolbar :refer [toolbar]] [syng-im.discovery.views.popular :refer [popular]] [syng-im.discovery.views.recent :refer [discovery-recent]] + [syng-im.components.main-tabs :refer [main-tabs]] [syng-im.discovery.styles :as st])) (defn get-hashtags [status] @@ -49,4 +50,5 @@ [popular] [view st/section-spacing [text {:style st/discovery-subtitle} "Recent"]] - [discovery-recent]]]) + [discovery-recent]] + [main-tabs]]) From 8d8170d9ab95ceddb1f3e7e3e8e08c6b4a101b76 Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Tue, 17 May 2016 17:09:19 +0300 Subject: [PATCH 04/18] fix discovery tag title Former-commit-id: ea63b1df6884dd6ff6d59fe8922db7360d33bbd1 --- src/syng_im/discovery/tag.cljs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/syng_im/discovery/tag.cljs b/src/syng_im/discovery/tag.cljs index 455adce8fc..0251e1fde5 100644 --- a/src/syng_im/discovery/tag.cljs +++ b/src/syng_im/discovery/tag.cljs @@ -17,7 +17,8 @@ (defn title-content [tag] [view st/tag-title-container - [text {:style st/tag-title} (str " #" tag)]]) + [view {:style st/tag-container} + [text {:style st/tag-title} (str " #" tag)]]]) (defn discovery-tag [] (let [tag (subscribe [:get :current-tag]) @@ -31,7 +32,7 @@ :style st/icon-back} :handler #(dispatch [:navigate-back])} :title "Add Participants" - :content (title-content @tag) + :custom-content (title-content @tag) :action {:image {:source {:uri :icon_search} :style st/icon-search} :handler (fn [])}}] From 97f1a4bafae111144608950f1f8345db37b7863d Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Wed, 18 May 2016 21:42:40 +0300 Subject: [PATCH 05/18] change icon names to keywords Former-commit-id: 74e5c4128d428826da3f092dfdf9ee328391e2c1 --- src/syng_im/components/main-tabs.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/syng_im/components/main-tabs.cljs b/src/syng_im/components/main-tabs.cljs index 7116b6a3fe..1dff88ab18 100644 --- a/src/syng_im/components/main-tabs.cljs +++ b/src/syng_im/components/main-tabs.cljs @@ -19,12 +19,12 @@ :tab-list [{:handler #(dispatch [:navigate-to :chat-list]) :title "Chats" - :icon "icon_tab_chats"} + :icon :icon_tab_chats} {:handler #(dispatch [:navigate-to :discovery]) :title "Discover" - :icon "icon_tab_discovery"} + :icon :icon_tab_discovery} {:handler #(dispatch [:navigate-to :contact-list]) :title "Contacts" - :icon "icon_tab_contacts"}]}]) + :icon :icon_tab_contacts}]}]) From aba7d4fae0e4bfcb5ee3e1fa159aeff0432120a2 Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Thu, 19 May 2016 18:41:25 +0300 Subject: [PATCH 06/18] fix padding Former-commit-id: 0556e299d6fea7bb50c106a65cbe4b1f75df19a7 --- .../main/res/drawable-hdpi/icon_tab_chats.png | Bin 401 -> 537 bytes .../res/drawable-hdpi/icon_tab_contacts.png | Bin 746 -> 792 bytes .../main/res/drawable-mdpi/icon_tab_chats.png | Bin 307 -> 295 bytes .../res/drawable-mdpi/icon_tab_contacts.png | Bin 525 -> 504 bytes .../res/drawable-xhdpi/icon_tab_chats.png | Bin 442 -> 435 bytes .../res/drawable-xhdpi/icon_tab_contacts.png | Bin 994 -> 936 bytes .../res/drawable-xxhdpi/icon_tab_chats.png | Bin 613 -> 651 bytes .../res/drawable-xxhdpi/icon_tab_contacts.png | Bin 1394 -> 1329 bytes .../res/drawable-xxxhdpi/icon_tab_chats.png | Bin 893 -> 777 bytes .../drawable-xxxhdpi/icon_tab_contacts.png | Bin 1892 -> 1775 bytes src/syng_im/components/tabs/styles.cljs | 4 ++-- 11 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/res/drawable-hdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-hdpi/icon_tab_chats.png index c6792ef46c8aa0bb341a471c797c88a343dcdd9d..cd49ce400390d2675e7c9a175095ea2b9ec01894 100644 GIT binary patch delta 437 zcmV;m0ZRUn1DOPnZhw|ZL_t(oh3%NJZh}A<$NwlMrYTK|4v35C*qFFT9J+P2K0qI! z%=Qg5eE?nS1M~r!=xAJ=bYU^EgB!*)wjHW172mv-y=2AE zO>EW*5WzjfglI4!8cc{r>=0DW%$8_X#+c=--g>n3uKJrknAglI6K{lo?U?LEYC zJrMLluo*U0sna+tMCy&ZOf3W%06^pKxM#^oy`jpX$u2nY5IUaBW_UvER(;fK&iELO fV?V4YL{8`z=Wh4nYWPAp00000NkvXXu0mjft_{i! delta 300 zcmV+{0n`4O1d#)fZhsC*L_t(oh3(c&YQjJmfZ=yka3KN7Mko}zE#wLwz>ByJJ;C$@ z-8Q{Q58xF7-3p}vH$fa+2!`pV2CI!<7D;Co^FkJxe1wPm5tY6cPbf4H;WmRst28Ti z9$-$H0sdeBqJe9{WdS4=KvDrDHM(_BDR{ge1Mu;Az}o(1M1Rn1I%2tqiK8I^rKxy( zFWGF5ozI-tc+2L=q&^8i91WQ#lU`<8fs%)@xYpH7D^R{Zh-+QVv;wX2J*BDY{nAvd z@_jEe=czO+8lQO=Z`n`U%kV;$^f+w|@cMH3oUCuoxK6a zLNlvZonR%Yy_=qs1S38_(SEK0NKqK5BMg9W7)ntlDE9eXDIPQU^xgpA^ui*UviuR1 z7}iT+FJ<_p27hX95{wVOrN67?L3`pP%i8uWx%>iB7YsmuR}16AZ~ZRo z4=5fpJYmYA;xXg(fZQ_^bc~mLyR2671$25*Ig(Vyc*z$~GG&oC$v)ekILZ1Bf8Q=! z+rIULa>L%QJf9yb%H<{BHgDMclc`E#3=HHdnFgimfE~h9umT&!uU+C z$oHK)e*R9^CNTN+@(%K!iX07*qoM6N<$g8#o!Y5)KL delta 648 zcmV;30(bqG2I>WnZhvPcPX(5wtym%&^ni?>Kz# zo8QcP-}`2ss44&gGQU`TVwyUoA|pVCWT}ekX4A;(%el-O1%Cw)Rpr^+-G1A*mr*7X zmN*+>&9l6jSC0oOMnF0$1E5UUzP&6UGQUun6J?=eGN(}CsWDBR>a<9JY3h_YS-_V9 z6&bOKSxo|r<{a`vJq%p$0$_LVn9}wU8)dguGSSJ{aYm&bi`mI*4EJ~caXp_+k(Y-rp#%E`@5N)yoN;9i6JzabIz4HEj5~Rk{8Mk^&}D-5LqZ# z!0nC=h%A&ek%e~mjuVLuh%8jvK1w7uAhOU#*=4KJxG-+3(qNxd@=tv6LHyA)$g%X$3&Wq+SEk)|x|SUkMj%h1hkZlo=o z)Y;GD)|>pS`E37a@bSxGq^=)Y=zh-O(b!dN>*5~nqzr?7hQYor#%?>j`+N|3t%aJh zd^W}Ocsi8K-`JKgJ)S0?O|?(x!JS?t&d1FOBCQ;46S@_nYsbwIO6YrxCK)$JD4|bZ z57D?=FMpug%F#BV(oUU~^%|ZZ-OBTomGv5>oqDMF&}CmNyL{WJ|C4>FO2~h+n(Onv zcn~^y45~&{HxowS|p%pWK~d==Zn=sM~`CwgtZrQnMtFdp5@ITtaVbx iv%DDvmCJUd_Zw-f{;%?vbe{kK002ovPDHLkU;%=?+((fB diff --git a/android/app/src/main/res/drawable-mdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-mdpi/icon_tab_chats.png index 8d9d11dbb0dc1aa8bd8de78e46dc9df29ce93bd7..6bb1a35f9219f474c85b3fce4c2aefa0f9cd4902 100644 GIT binary patch delta 193 zcmV;y06zb-0;d9yZhxdnL_t(YiDUf#|33pQ0TWG4r-ubBFh=3b=Q|h}8QiI6@_&Y% z{ppe(2p>?>a3u4FejJQiK)wYIdfW^RF=7l3dfX(75p4lK7c+)o#E21P!GTL(89sjd z%W&Y*SCYk$0VAxiE1dP5>ZM+Pnk3^ePDP^@F#KoO$-sbAA37k(H1?-SHBieQG#^mc vaEOur|1o%p!ZKc)LHL-N5h>HjmIRIstNJ#?Gkdqv*A~pa-@UwVMz%f;7YU0{qg_5J@Z-vhNrp{k`J2fe98a>p00i_>zopr E0Hp9%#{d8T diff --git a/android/app/src/main/res/drawable-mdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-mdpi/icon_tab_contacts.png index ba6be3d17f46bd8fb9c02a0398b08db720c254eb..277368a9b873bf85ce1acea18e14ce124dad01b3 100644 GIT binary patch delta 404 zcmV;F0c-w^1o#7xZhv)2L_t(YiN%$%YQjJOhQCWv5D|0|GKCIOD5X+_P6ffC@6g#- z=-?wb_zKQ-@77IlsUW4L2;xvOg=T3(iwH4Z2NPOt5@Q{h!Fa}KI>TGWdgwn5VyRW~T-Co5493IBZ0oa1 z5`$pp+vZXm{DnjYgYoYu!sfzA)WK-F65A{}GXrnADl|!{o9w-V*b^A#15OWfoESOE zrS+xu`+{e4&VSR(9Mg7pH#k39fA=>jmoyrs0*z{co4yknUt~m=XN5@dUDp2JcX0Rc znOG!lZDa?-$&A-GH?xv0LjI_x?PA(4xAz}g&Jc`gQG(O||zV~}_?|Xj; z=Ny-}%y2zYB;Z*9I)aID5L2bRP|oWXxwvT?o`+`u@qpm(vVSQ>N^w0>3;_-Ran~b7 z<+ClJh=6BRNc4O=N|DRNkkr=!04+8~tv*0+=!urc z6Gdc@%f#m3GiecmTqY)3E;g98<*zwugP;-`wAgs5oU}o$K7cdf3vp+{QL7Jx2EtR+ z8+s^JyUQL^v46qL-ORV0UYmd;w&ro2Hu-C8qLvy9SlyY9TC`F2cR3ZSd6@VEBsZfekIj>tEpx~30 T=G!Ko00000NkvXXu0mjf^vuOV diff --git a/android/app/src/main/res/drawable-xhdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-xhdpi/icon_tab_chats.png index 7c188096adab636ad2e38f2c3da23031d45f2f72..87c2bc79f9631099195b1c953320e45b3540bf84 100644 GIT binary patch delta 334 zcmV-U0kQtN1G58=ZhtUIL_t(&f$f+vPQx%1hCi21S(wY-rE8^5l{g0%$PD5F^Z-?v zd!9^@x>iCxKyQ!@%m79xiJL|xeSYG7lWkei|HXcaW9Pj`Gb8B$mtq3an1D3n`oQD% zxO9#+o`po9P8_B8Jiq3X0$Nre>F@xag>$S!x4DH<4j=fHQGb06n1D1UAdLw~V*=8c zfHaNMXcsplm`^j7vkZV@U$Hw>ynhTk@6QD0(~O7v+n;`Dmv7ae^J4VgLg7tadn|_f z8t5%h?3+t_jj80%8M#LHwAE+W-In07*qoM6N<$g4WfY?f?J) delta 341 zcmV-b0jmD91G)o{ZhtpPL_t(&f$f!W0f+id@@41Rp zmIv@8&M}EpmS5vZBIyo)#RQ}=0clJ?8WWJl1f<#BCUmgBLw}aWoE+@|Fki07i;}13 z7m@r&+~suPL*=i}4jGT!#`UW9+&w(D9@2HbN$?fQ(ztbVfbqzYrE%~1CP9Jqwr;!D zb-s!EAr1=6m#ZJGb)9b#6v&H`s&3DDReSQH>^5;K9p&Lu0X^lRC7`Q3 nYzXKp5AOmx%L7E3%LBXuB&4~0iu00000NkvXXu0mjfwN0Mg diff --git a/android/app/src/main/res/drawable-xhdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-xhdpi/icon_tab_contacts.png index 29bbfd2a167ae9998ab280c37822a0932e860e14..9192c55522d6ac78452e3611ebe9ff96306e5dd3 100644 GIT binary patch delta 839 zcmV-N1GxO+2dD>-Zhs|7L_t(&f$f@2Pg6k@hM&3Rqb)H7BA7x1A_RzCC?bI^Y)Ftl zAh0921>%k$;Lb!gE?^7z2hb%ffhZ9dkV2492{ZvTG{&|T+Huj3To5R8nSL3c)$Q%% z&inSBnR8~QLP|*?W8_-EZ7I6yix(GIw?sDBHlGvxz{7L zTbDHw7eh#Z7@P8s0~V5Tq~1VG+MbjD;sG2nDF%`s zQU-*KJ>Z!7z8hxQ8$?sy zPieg}ky*jzv@z6EPE$?Ex%-~FQap8~JZW+;vv5Kn7}eINwo*dCrQ*#r)s!&QQ;yKp zDH;uQwK}gApQNd#gsxVnu5R@i@HE&n(l#C13?v7v?tixFDEM+(n}NOK(~PuDhc*N2 zyWxzqO@}rE%ibW{2a&YxwhtmKdxN^V)n`BgGYcozn%F*wFtc!?D;oovGjSjoJf;n^^J&S<)CL*YSTE%{2vY;8tTm0FNHnd01zs%4MU;`4_5*qG7N3#R}k2BtX{K>k{T5_`# zLT!x>hI=cN#b1WIvWVf{3fda2?I$Q3sIM+&u-m0|Q6hlBZWr~{>Q$<;fzB2uHbbZU zI5tDj*`mJCQ8v(ATdLeiCZApK)2On6t^MDb(0^h1*~$i1HiJZC`cHMDG0DoNdi|tq zz;}4c>|#J`RVjhl#Q?rT^_7~XiTv}|5Ro%!DUn^|wu#Jg@9VxW8@_N}l@fjw_eUkL zwi9M;N8cLvhWL{grtNjPnr#(UF>5t#uN$9oBS#%6_}hRXqVI^G2Ie~J R!v6pO002ovPDHLkV1fyul41Y= delta 897 zcmV-{1AhFd2jT~iZhv1%L_t(&f$f^XPg7YGhrjc9mDUCu$<#@M!bAzgnGnZm8Z#Rb zS5CymtZ`{NTTplW0q#s>Ik1+si@~rn!^RlW874%Ggdr*7G_i)HlG(> z-tefIZ~N}K=lovIJ@?%AuBa+|xjX%Opsq41N?JwIK#FiFh<|EMg`6Wgb3fa&viG4h z1qjIaRACIb2gE`Mv=u7A#Dm{blL`vE0t94iy6}f6*Fz4lB~*AknN8hLPzPXqsxa0r z!2^hLeK%W>J5w72b#)dwzG<@`6-VknI(3y%+Any3SY2h*5hWdVBta1+?d+DywnRnJ zE|%+jGU1Z$kAHDC8R6VF5ddDjt+7$8kz1`$EO|EFrDXi~|Mc*2havrsp=Th;S^-!SGQ0(BSuS zvA2`qp|}m#<^qxlmyt}DZ@ZC97s-Tq0vHQO_s90l`G13mxWZ5UQB(Kk0?sBQfo;zv zPnfzl7tkz~M{V20$|4REV*#(;)AM5dspct< zp1!lz2Y-R3W)2!6{#+`vyuN*u?X*1sO^PLtxt#ws5tRQovao4;0Y+;;fJ^72eBT=- zndl&yaEV6`ekbK>onpzOSlVHEy~;mpRila&Silc`QARRdq`Li05sx~=qbK<8TgVK= zC~P)1!sq#5yK%&pZ-S%bFw}6$`t#_SAF}H64 z&tAS~r*5m4{KQUOdG_+XZ#&-t@^5N9d{VO34nw1pefXqA{*C|RX`n*>_rDcBcp7LU z`+6MHjV!SD=lLqj`RcJ~B?<)mN1(vsT9w5$^TT;S3XZ7e!t!p4sOB6M+E#!HImZ#5 zq45X2-KaRCGtTbagNd-C3BbhtY|qNqan(RUC$p&=z-^9qI#qz%&ER3rZIveNcHQP9 XOPF0evFa|w00000NkvXXu0mjfYS70^ diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_tab_chats.png b/android/app/src/main/res/drawable-xxhdpi/icon_tab_chats.png index 82dbb8ff905cd315118d659e4bdb04c99ca8a264..382bcaaaf6a062ccef0103f8ed7b9defba0a384b 100644 GIT binary patch delta 553 zcmaFL(#<*{x1Nc^)5S5QV$R!JhJH+r5=TFpOFIgCYFuGj)N2-Yp@J!DeL`wu=Unp( z!Z#*nEbI;6@RY^mLb4|7Muo;BD++a3Vz1maUn5=qcuzg6_0LH+<0F`Kjzw{c#!mRk z_Gw;&2a^(Khl;`^2xE)L)`F7GL#y`MZ#X8yeB<|F+tm8d;}N%K&3JXzRrvho=7|o$ zb5`%a8Lf9~^RbwFX1%3sA@}1v_sqMx#(O1W?v%&t zukHA{CN0*BH^ZU|CS3YnPI!H~>Fb~@hqw16{vN#CpZ)is@U6Xt@6uw80{<7;?v&B_ z^Zok&PnIw0_e2_QKE9Ia@AN|szg9U433xiFFivD~!OpnDH+v#&|2|z-6n`jug1m);l0tn!Lu=!oLyTffpZM7e*ggrf7chMi wXJ6n@_n2X$!y(3`JloaZmA-^F!-MV%+vx?bA2Muh&0_!pPgg&ebxsLQ0HyBwF8}}l delta 514 zcmeBXeabQ+x1RBlr;B4q#hkZy_If2d%Cvn{j}-OXEEdfwrlZ4@8NB41RZwI^L?vex z>upZ6u$_FbMKYN+gE$VY)VZVPk}TmlZk`6? z1?|id%;5(L+Qa9}et*}$>}$kKlS-U-n zgFUrR-v5bT`fSS7nod)NU6KupzsWT}W|k72C9Ea6;(n&9`R1J~>z0Ss&$L`Psc~2P z@94GxaI*pBJSp_}%_|?V7W>ek)QIoV>5xa#OOkXReG4t zlUp00i_>zopr0L{|i2><{9 diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-xxhdpi/icon_tab_contacts.png index 01e00d5632bdda3781c0c7b7594cc9d04b54812d..19f17a094278dce6050f899d72d668a15272e085 100644 GIT binary patch delta 1235 zcmV;^1T6dV3b6{1Zhx*xL_t(|ob8-FOdD4mz<;*k>_TF2L?8%4Kx&|h+Dc6@EnB4o zDP1Ztc7i1=oji48h*T*|>|}u{Lk6TykqAR4%12s>s8Jx1f*{CzDS#V{@yEHt9g%$; zJ|DdM2)>_$kj?q||9rP~ZnJ7#b6noa^-+h z_h{i8T0wX0i^a8c7rxL6>c*oeNxTd?Ns$9>dt>|9s=Y~~vqj?i)oQL^Rc^c1wll14 zXINfOv$9!oBwz(a4jgNcLz0jF-Y`8~H7EX7cO$^pH-AF>)D3e>NhW6!q|(mJTR9@A z$eeh~~ zBRx5jVE-Uz`g8jSIVNWk7DQAU+Xbc4c_ya!Oi9{5$T2a!=g5fOk#7FoMw&-Yx68WR z=9ZE?db;h%NFE%V4@#x;Jo$59NHvZ10UGP8XsoNEHe~MH9HeBn_Oop5W!c)xv9X)s_4^}a*`mNz zEEDASL-&_o(0BVX4Po<>^jc~|emX)D9R+jJJBb`qfB(nA+e6DlSt970_7Fe+5Ede) z6n_oj0KfcLPv7m!{P92nik%Ry;?nDd}^1Sg!#q6v$B)OF+R1+t5xyspe3XEmwziM z{#{K8o$k=%vz_h$kY$)#K4jtT;f0zoizE2I?PXcH?5s$Ci-;G#(4NK@HU{EWiX3PK zE!Y@{TPZ2X%OFjXXa&uqJeF9gWKkS^qDYYXtmcTF5xI;J?UogKeeFY(N2Du_MU=W1 zaYB&#-1s2M!}gUz24#zi6Qf++yG%882Z9)tAt?jIPTRl3+uY==o14I=Oo{@(bFq52 xEJ~fCrQ|>v`v)E4ZLs8_i?^y_fG5a+{{bo#shXu8`2GL@002ovPDHLkV1i=%UvvNf delta 1301 zcmV+w1?u{-3i1k&Zh!AdL_t(|ob8-DOj}nNfIlBUFvLIzuNneLq^7NiisS-nl`I)R zVyeX0b_h#Yvcyxj43Ro8F^4QbiKwVeG9VLhd4&KD4`2Jb!}TR@ zu(2uU+-vIlNeJ=!{on7Nd(XN5F~2LFPLq%DXsj9N0lI+h%zx)#-aj}S#DLk%#|$t% zG8A0N_sgzag2JOQA8-%&7VxOavt&pD!@&KKp7F`(0m>`I6^U~pt8 z7|H&o$o?Wc8oL8bQGRm3IOeI0gF_BSP-f&z0bc8KD=9SKb8{rQ(&@B$&zYt?M@}y0 zfS!?|V8Xn_?tkIP$)*#-39h>jmYacB{QqaGlad533XFA*Bj+d{phsXV03CAEEihKc z4!P-a1RYP82OFQQ0+oXHMlWrRUfLSGv^DwwSX@i6xUR9drV(A!i0|okr5Lp3=Ij>G z7pkT=6u>Qx{`}e{Ki4k#0Z8dE5!qof5+`MYC(8x3)_;5X`erRH^~EjN-2(c%s_DG! z=Z7a-ENy6tGyFF>&YwDNbW{-@Xee4vHZApD!UGN5=%`YVS$-@N)LQRl;CgM&OR8Ah z0tT)ZKl)@~i6FOtuWp`BPIjzsB*iKQOJ1fgR86bIv))qgr7u)1E#7e`7Zj)z^o9b` zw$ z7Evx}aqY-f)0v2EqF&Itx@RYqu}v%(K?(&ajBTP^P;^aGQl?1hMr_q67Zl&qnT*7x z$DNGCEh(f~GK)<_cBIyEmNzseB0JLJ9fu`?Qhz%9_+(4UrIym+dr7g1!LoJG(uT(4 zr>8rxln#%dZn11(RngLt>o4=WEUaiJD!H00Z)moZTwQk`Ea!iVnIZ}m?XxMnqCFS~ zJwCg`&+~6fecQ+0J^A>a&V2NM`RIY2X&j65uv!2|Pyrl41#kovz!6jc<+GR&@X5sr zK7Xk5(sbTU(|Hd~wI0s-Pj+tJ?(3{>C0TuwWc5vozc)4he06}Xcm<$LkPy)QVI_T^ zRnt)8K6Sive!&&Lk1NgZ>d@=kDJFj3VdmwYGEqua(w|=T^W_&cQp6O)`gV$+e%0V@nm(-sI(0ZymxVGiq@N7u@QtqrFM) zUYRsORTYBU{TJ|gY_OBT=W%hn{{mGN^3J=oNLO2Z1Wq_JsUYANTy2%Np(yQ$K5mtN z{r^{F<|0kdM;r=}w_7ioh2Dj`8KbCD+K#ZrR!zI~-plYjWW z&Wj~^Z)%VxX!k(p;rMG3Nz3;D4oM`_JRE<`?t#1$CG{p9UDbFrxruIrBRvg|CO3($ z%H0-{K8wvq4;Y)+WPLj&J9J*ww^NKwY$_@KD=Bw8TiEB1=)Tl)M=q==cPOg|={o%O ze2d9VU(e2dB~=-G6xI-r0?J z@7%Dq{<7YnF!^o5p#urYOx?{oM-rs0A|`zc+0p!c@AHQD>B9H+$n4K|dB>!-`KHf@ z%I9_svF;4UOfv)z^f08c7$`SLGM?c`a03bLJ-_M2>F*cQJ?q6M`Ker8EO+snr01?_ zCHLN5sbBiuXIgB}Z|gtvCuIfl<(K!U$}U$lErbKDst zZ-%(fhbs-e@3GFrVhcf`X)o(HFH}^SbZhOZKECf?Up{8{yma^P&!wkV4D*;=A%%Stm&jK=wO{UiaKEzI?`v;O_O;zD-p%@l zH{r)>4v~h3>$Myh+V=OEG8_CUT`Sn|uzf=kL!105E=Gwu4@;ong(8-OABHJB2Rq>k>@3&BZ30g)#DGREmD@tt{Sx|#t9JYD@<);T3K0RUE&LgfGe literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ zn8$)Jqhx~{kij5X;u=vBoS#-wo>-L1P+nfHmzkGcoSayYs+V7sKKq@G6axd(FHaZ8 zkcv5P@9fW(DwH|)@p!kIAg9yHW>x#PT`3%m9t$Q%GB2!mn;X0<#b zO!-=sxKx|Fz3T+noey?NEH03}f4+PCvr;{Mk0R&oZ6E&yr!ybm zY_Mgh^q67AaE?JH^wiJpBM)DmWow9M*mURhENfea+hTHcpSJ#ak;*tHqGHEej^p!K z?|z>7N$fY*v$;$YG#O@+OhjJ#av;X6GfA=cY7AGlelSDB>f46vb|;(MaxST!ymQ|F zkVhZB95XZGaLCkdZoVtJWKw5(zodUo$m`lG=h#2|UQ{^${f}L0Oezd}Zr3-S{i^DJ ze7m0ek3WC6KQ|Zr{`0cLPacijRGWAkhMaZ!3%5+2Is4~j7QP9m)e1N4e)M|}(8MR3 z-pM-xO;IaoNK$-Taej{4RG)<98{Smi@k^|H_VcLIEW7)@4;WVOymIFGx~F2jGLMg( z-r8yl66>#D)moZ&=lSl7;)a_JFs{oxzHpxO_n&!8>^t7ERWRSJRz7a=u_!n3e7UfN z!(!Vb6_5UFpR7n)d~;v1?Yf)$W>?lNwp{|2+-~l;_1^c|I3V#QM)lq2yAnSI*3IR= zuuG=WZeOXT)7u&Y^Uup8D?Wcays^{q>^FhK)za%fcSmfPBcE3L`{wcM^7S?L?w!AD z)Q`<;v+Mf(_|Xl!zG*jKbW4yPC3ticl!`RG_F=53V(1f5sFG!fXUGW$rjmyLACCQt z(A;ljRuEXMeIUPKTK=IP#w|6$X&eil&VFJHP;-|?QNZ~N-60J92%r>mdK II;Vst06lhy2><{9 diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_tab_contacts.png b/android/app/src/main/res/drawable-xxxhdpi/icon_tab_contacts.png index faa0af93ceadb6a393102d65ca9e58e793929f7e..d5bfcba9d2ce1084f88421aa3a85bf214abe9d60 100644 GIT binary patch delta 1685 zcmV;G25R}_4(|<+Zhve^L_t(|ob8>@PZU=iz(2dgT3{Cz3)n0aYhu!fKUztRp;!$m zkhDF}V0ut{^1`tRe*xjxOG!L(uX-wxOPeSOsg=^khNddoCME_7o4R0G7+7_8c6*rJ z6y4c%f6ROHaORWjh3vlf<@=d8Gw;3G{rWPQ3?9zmcRB#K<9`Wo7*Bx1)KvPxk%{OV zKp!v&bOMp=D`Zb-%Ay0&?CU--1x$|*N1j#En6KQ6@W@2;ZD15Q$LpW$Qqh5{z}Wb3 z-1*`-NijT#$mC4>V$WGxO|leAvKULEC(;f_T9CZl zR=go26U`3;T@Cbih0rX)}ywqIlw?ygKh2E ziE;u$b$%hq>hB5>s#EUYRZqbF)_{=Hh2}TgR(}oU1at^YlE}6zMLhv60tE zkX>HbZEaVIasu3jasrlO&v#|pm7<=2RdH)KBHOMM^#sHO3J}oZXh*UdJQh z5q~Ht0AP77$>eNxi8InLIUBciG}(>PTavdHwt4hVvaBu194l+dU9lypv;Z(i!Z(wv zMK|Sl;%&+cz(~UnzisluH);JVh*S z@OV8%ES}W(M`8Mphxl%GgFBC&O6_0jMfmj5AQuPrDwF)3G=(%S4(#Rh(V*0R zrHz2oM}nN~X_VDnMfiM}F=pWAy)7wyN*Mv|%>f3x)qFnRioxy%+9iFfMv8#*y$jg$w9Dr1rNIiyM0X(!8L#yAXzq z*o6yt7=5n%E^vH@WIfBjrbH@7RqE`^5+d{E1@8HL+0k)E!K5IsSTMN>$>5{hK%%e zf;*3%vatBf@h!<5@h!t$Tao}qI>W7nZGQPPA$(K55U$>o&yg}R{CIbZTMOIXV<|h( zk^I}CMmj_ENs8!`-8*Y85r6&VKUf`JQ3-*#mAu?~0_0MXfcp{xaVvSbwGuETArQBc zms=|V(^y=%@m#JOCI)+z|3hLmIAW%t}cm; z$YoqAROYtWG;<8IDyT_RS=8<2tmN1mKC7HE&2KXB9?x+|E%p9F5rJ6RBQByugw$kb-a1MnlE=fkm zoI8yby4xv4*#dH8i+=WDmgnoltdSMr^_QY!E~-T_*LJ3WX{$+ADO4=L!ydeca~;ML f;4q#5hxrc*b~aapWDd<;00000NkvXXu0mjf#&R`S delta 1803 zcmV+m2lV*w4df1xZhzrPL_t(|ob8?6YZO-)ho709eC=*FYt+b?f`UY9YoLuHRo#cM7L(=oTEDrEQH<3zHi>&`FzhgIa;|~rW*P)Ruga#=zjxt0A}SCuj&h4U2MRr zyhecmU?`n3=c@T-?Rf(9XROzNQ^1FW!LAk?_#8N$PMMFM_28-k^k=LVyug0~wA9+e zI-v-h#S@~q(gQ0B(4Vn31DAl^fx1^e+yvfFr_71vAN)sv{*2WPTn0MD_*OTJ14q*- z^S8xsE)k$o@_&CK41Q3I1A7+N1l|9k(&k?x41SPw0+%YW1{Mi`*Wre3e(>zZi#1Sb zf+|DJKL|%Vq9_8}(<$?jUjt4N245up5FhQt`H3dr3E?D5G&Zn7$4f7S!52>)IH=?0 zc0%OPr{g8oLgcVR$IEDj$iWN+kc(;Xl61gEM5AkSBY!)$HnS;dkcjFeq7eXc1(#f* z#NSzm+xMR`HZhOmR=3U}nYec1{Djh;CZalrds^Am)k0H)R@Lv!EtL6XtjLw&S#pI^ zz#gs*L$(8}VMH`~d*U4Ej?rjT7kHnh2914hMA^N)g=-^u28V5BYlM;lv_^G~_qMa8 zqhU?o(|>4a9C|y>_Rc0Q3{EqvU~SN!|A<)3c7v10Hmo`Li`mlAz{z79Fx%BDZ%PT! z8r4Z1X(t(r)cm`Xu?VRn?X*Uf`jgcWz=&uZ?+qsSKFL^wN^!CJS z+U%^xmW~E`d(;_uDo_cji@jZlJ0?@Qm!}KKGFrKcccrDE4X!O+eZNbU?sB9H;JDrbx@dkGD=M*0EL{MAE5ozQJK};d z@07VRJS)uJvrs~ST%p9Zk-RW_*GBS6jDSE90RRSvZ5~W61a9ZSq_@t)I z(Syka&Rl$gH7$SQwH)OH0Iw#T`*Mn_x9l~Ij^>>*S8v&z`*KRTlJ6sbMPd~kx6D^R z&+_e^{42dVSNYx1KCkHZbaiXMavZnJ=)*ZiA6E5mcwQQm>;vkFPyoq<0!StlKz}l! z0Fns>kW46mWR#c(M0AagWQ2}3gNzty3=e0LgfSj}NV5|4wmd)j(h$u>Z{%AM8trGWSAg8lI13xPC{> zCIKNepmTi#eS6h76ju#>dt2#TAN-M75G24y@3kp$Ag)@Bh{i|nwF$8mxPJiK%tm3Q zsg`uEZ(y4l{2{);1=#y~G-wlnA;R~-1u)ksG1-10MED-K0PP9&hMd(R!uK#4Cz-$n zn9j*RhxMX}@I7z=tbf$ojaDrpd=FfJ8}|x9n+OaMz6UPApVmC%Q^9XLuQlUS3;byX ze}qX$C;ZvhGcV0fHSjipeSh}#j1XHw1Q?%MVBm%tM}n$h;Kr=5S}Sapbp1{qG&uH7 z0!`7hP`L~jf5-{Tgo5BD$?LcCWNkNGkXeNAJi*BQr`-K(E?knVASF@bmdbp0x4@6T z7Xx3EUkz0j<)voI9JkCjxAS~=w@}yHQfwsOA>fwESksP@XSf2!)_?IXA`X#*6$&61 zOUJv0J46nnI^G@VA#xbdfg!w(I7BQqFr=qb<{aJy^dVyTJe@M<{6Y3ONvF&S z|BWSymdXc5Di4O#mVa^J=;GkR3M*pilsN+IA#9Fn$xXbH|J(8pR!lWkRC*WqlyG#k z7K(T=e0O=t_gT^htVDmtdJXRa`VVCaeAc=ylu;oZV* tR$lckij9}hwD9t31He#ag8N+l1sg+%xhh9VegFUf07*qoL Date: Thu, 19 May 2016 19:29:17 +0300 Subject: [PATCH 07/18] disable 'create button' until new chat will be opened Former-commit-id: 6e52fca420a9ac5ef129914742578c639fa85e58 --- src/syng_im/db.cljs | 41 +++++++++++++++-------------- src/syng_im/new_group/handlers.cljs | 19 ++++++++++++- src/syng_im/new_group/screen.cljs | 6 +++-- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/syng_im/db.cljs b/src/syng_im/db.cljs index 92c9c0d645..fa814e08a2 100644 --- a/src/syng_im/db.cljs +++ b/src/syng_im/db.cljs @@ -7,27 +7,28 @@ (def default-view :chat-list) ;; initial state of app-db -(def app-db {:identity-password "replace-me-with-user-entered-password" - :identity "me" - :contacts [] - :contacts-ids #{} - :selected-contacts #{} - :current-chat-id "console" - :chat {:command nil - :last-message nil} - :chats {} - :chats-updated-signal 0 - :show-actions false - :new-participants #{} - :signed-up true - :view-id default-view - :navigation-stack (list default-view) +(def app-db {:identity-password "replace-me-with-user-entered-password" + :identity "me" + :contacts [] + :contacts-ids #{} + :selected-contacts #{} + :current-chat-id "console" + :chat {:command nil + :last-message nil} + :chats {} + :chats-updated-signal 0 + :show-actions false + :new-participants #{} + :signed-up true + :view-id default-view + :navigation-stack (list default-view) ;; TODO fix hardcoded values - :username "My Name" - :phone-number "3147984309" - :email "myemail@gmail.com" - :status "Hi, this is my status" - :current-tag nil}) + :username "My Name" + :phone-number "3147984309" + :email "myemail@gmail.com" + :status "Hi, this is my status" + :current-tag nil + :disable-group-creation false}) (def protocol-initialized-path [:protocol-initialized]) (defn chat-input-text-path [chat-id] diff --git a/src/syng_im/new_group/handlers.cljs b/src/syng_im/new_group/handlers.cljs index bbd07a1f60..3823eb1c2e 100644 --- a/src/syng_im/new_group/handlers.cljs +++ b/src/syng_im/new_group/handlers.cljs @@ -58,12 +58,29 @@ [{:keys [new-group-id]} _] (dispatch [:show-chat new-group-id :replace])) +(defn enable-creat-buttion + [db _] + (assoc db :disable-group-creation false)) + (register-handler :create-new-group (-> start-group-chat! ((enrich prepare-chat)) ((enrich add-chat)) ((after create-chat!)) - ((after show-chat!)))) + ((after show-chat!)) + ((enrich enable-creat-buttion)))) + +(defn disable-creat-button + [db _] + (assoc db :disable-group-creation true)) + +(defn dispatch-create-group + [_ [_ group-name]] + (dispatch [:create-new-group group-name])) + +(register-handler :init-group-creation + (after dispatch-create-group) + disable-creat-button) ; todo rewrite (register-handler :group-chat-invite-received diff --git a/src/syng_im/new_group/screen.cljs b/src/syng_im/new_group/screen.cljs index 85a344022b..c551dcca06 100644 --- a/src/syng_im/new_group/screen.cljs +++ b/src/syng_im/new_group/screen.cljs @@ -18,12 +18,14 @@ (defview new-group-toolbar [] - [group-name [:get ::group-name]] + [group-name [:get ::group-name] + creation-disabled? [:get :disable-group-creation]] [toolbar {:title "New group chat" :action {:image {:source res/v ;; {:uri "icon_search"} :style st/toolbar-icon} - :handler #(dispatch [:create-new-group group-name])}}]) + :handler (when-not creation-disabled? + #(dispatch [:init-group-creation group-name]))}}]) (defview group-name-input [] [group-name [:get ::group-name]] From 6e53d72acb247190154b7d02c7568e1d86a7ac10 Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Thu, 19 May 2016 20:05:04 +0300 Subject: [PATCH 08/18] add gradient Former-commit-id: 799808965dac2236d21cd07e6a32e664f17e6711 --- .re-natal | 3 ++- android/app/build.gradle | 1 + .../main/java/com/syngim/MainActivity.java | 4 ++- android/settings.gradle | 4 ++- package.json | 1 + src/syng_im/components/react.cljs | 9 +++++++ src/syng_im/components/tabs/styles.cljs | 25 ++++++++++++------- src/syng_im/components/tabs/tabs.cljs | 8 ++++-- 8 files changed, 41 insertions(+), 14 deletions(-) diff --git a/.re-natal b/.re-natal index 54a57bc450..e3b67b5de2 100644 --- a/.re-natal +++ b/.re-natal @@ -14,7 +14,8 @@ "react-native-vector-icons/Ionicons", "react-native-circle-checkbox", "react-native-randombytes", - "dismissKeyboard" + "dismissKeyboard", + "react-native-linear-gradient" ], "imageDirs": [ "images" diff --git a/android/app/build.gradle b/android/app/build.gradle index c291fec7de..5f502d9326 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -128,6 +128,7 @@ dependencies { compile "com.facebook.react:react-native:+" // From node_modules compile project(':react-native-contacts') compile project(':react-native-i18n') + compile project(':react-native-linear-gradient') // compile(name:'geth', ext:'aar') compile(group: 'status-im', name: 'android-geth', version: '1.4.0-201604110816-a97a114', ext: 'aar') diff --git a/android/app/src/main/java/com/syngim/MainActivity.java b/android/app/src/main/java/com/syngim/MainActivity.java index b080070f49..556050c853 100644 --- a/android/app/src/main/java/com/syngim/MainActivity.java +++ b/android/app/src/main/java/com/syngim/MainActivity.java @@ -10,6 +10,7 @@ import android.os.Bundle; import android.os.Environment; import com.github.ethereum.go_ethereum.cmd.Geth; import com.bitgo.randombytes.RandomBytesPackage; +import com.BV.LinearGradient.LinearGradientPackage; import java.util.Arrays; import java.util.List; @@ -78,7 +79,8 @@ public class MainActivity extends ReactActivity { new VectorIconsPackage(), new ReactNativeContacts(), new ReactNativeI18n(), - new RandomBytesPackage() + new RandomBytesPackage(), + new LinearGradientPackage() ); } } diff --git a/android/settings.gradle b/android/settings.gradle index 784925e19a..cc6a4e9391 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -13,4 +13,6 @@ project(':react-native-vector-icons').projectDir = new File(rootProject.projectD include ':realm' project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android') include ':randombytes' -project(':randombytes').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-randombytes/app') \ No newline at end of file +project(':randombytes').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-randombytes/app') +include ':react-native-linear-gradient' +project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android') \ No newline at end of file diff --git a/package.json b/package.json index 48ab8e052a..561b5de8c8 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "react-native-contacts": "^0.2.4", "react-native-i18n": "0.0.8", "react-native-invertible-scroll-view": "^1.0.0", + "react-native-linear-gradient": "^1.5.7", "react-native-loading-spinner-overlay": "0.0.8", "react-native-randombytes": "^2.0.0", "react-native-vector-icons": "^1.3.4", diff --git a/src/syng_im/components/react.cljs b/src/syng_im/components/react.cljs index e19ffe11fe..aea94bdac7 100644 --- a/src/syng_im/components/react.cljs +++ b/src/syng_im/components/react.cljs @@ -36,6 +36,15 @@ [image {:source {:uri (keyword (str "icon_" (name n)))} :style style}]) +;(def react-linear-gradient (.-default (js/require "react-native-linear-gradient"))) +;(def linear-gradient (r/adapt-react-class react-linear-gradient)) + +(set! js/window.LinearGradient (js/require "react-native-linear-gradient")) +(defn linear-gradient [props] + (js/React.createElement js/LinearGradient + (clj->js (merge {:inverted true} props)))) + + (def platform (.. js/React -Platform -OS)) (def android? (= platform "android")) diff --git a/src/syng_im/components/tabs/styles.cljs b/src/syng_im/components/tabs/styles.cljs index 59d106c904..4a161ba2b1 100644 --- a/src/syng_im/components/tabs/styles.cljs +++ b/src/syng_im/components/tabs/styles.cljs @@ -13,18 +13,24 @@ (def tab-height 56) (def tabs + {:flex 1 + :position :absolute + :bottom 0 + :right 0 + :left 0 + }) + +(def top-gradient + {:flexDirection :row + :height 3}) + +(def tabs-container {:flexDirection :row - :position :absolute - :bottom 0 - :right 0 - :left 0 :height tab-height :opacity 1 :backgroundColor :white - :justifyContent :center - :alignItems :center - :borderTopColor "#1c18354c" - :borderTopWidth 1}) + :justifyContent :center + :alignItems :center}) (def tab {:flex 1 @@ -46,4 +52,5 @@ {:flex 1 :height tab-height :justifyContent :center - :alignItems :center}) \ No newline at end of file + :alignItems :center}) + diff --git a/src/syng_im/components/tabs/tabs.cljs b/src/syng_im/components/tabs/tabs.cljs index 257cd60260..c784287c5a 100644 --- a/src/syng_im/components/tabs/tabs.cljs +++ b/src/syng_im/components/tabs/tabs.cljs @@ -5,7 +5,8 @@ text-input text image - touchable-highlight]] + touchable-highlight + linear-gradient]] [reagent.core :as r] [syng-im.components.tabs.styles :as st] [syng-im.components.tabs.tab :refer [tab]])) @@ -19,4 +20,7 @@ (defview tabs [{:keys [style tab-list selected-index]}] (let [style (merge st/tabs style)] [view {:style style} - (doall (map-indexed #(create-tab %1 %2 selected-index) tab-list))])) + [linear-gradient {:colors [ "rgba(24, 52, 76, 0.01)" "rgba(24, 52, 76, 0.085)" "rgba(24, 52, 76, 0.165)"] + :style st/top-gradient}] + [view st/tabs-container + (doall (map-indexed #(create-tab %1 %2 selected-index) tab-list))]])) From 5e25330d5865c3648b1f426bf342ed9bd91395ea Mon Sep 17 00:00:00 2001 From: Jarrad Hope Date: Fri, 20 May 2016 15:45:35 +0200 Subject: [PATCH 09/18] an icon why not? Former-commit-id: 4732498ba26fd4c13cddcba6c7af784910477536 --- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 2419 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 1466 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 3577 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 6608 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10248 bytes 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 android/app/src/main/res/mipmap-hdpi/ic_launcher.png mode change 100644 => 100755 android/app/src/main/res/mipmap-mdpi/ic_launcher.png mode change 100644 => 100755 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png mode change 100644 => 100755 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100755 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png old mode 100644 new mode 100755 index cde69bcccec65160d92116f20ffce4fce0b5245c..f878f32946811477f79635d096d9c61e0d0f6467 GIT binary patch delta 2409 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 D==IO% delta 2195 zcmV;E2yFMd3!V{>BYyw{XF*Lt006O%3;baP0000WV@Og>004R>004l5008;`004mK z004C`008P>0026e000+ooVrmw00006VoOIv00000008+zyMF)x010qNS#tmY3ljhU z3ljkVnw%H_00*E+L_t(&-tAdkY!ufO{?475^{#iq-c;^Dmy#{tlF zn2UDq+?oI&B7XskqVt14KD48|Z|2gspW4!NjY-f0yVrcCZHvtAf9?KnMZp(|!29oH z21uZ${mz;f0I1iHfV!f0?jb3Sns?v0Fc8I9Q3%Mx2i|z^lXDZt;&r^?splVDAE6(G ze9B_k_1t~y<7uqB@b`&Ve|zw~(*U>@6A1>4^+}vU}5!#{kHC?rGQ7Y+rpxY>wQfCgoNV z##{y$v463{hy((3%FgE0mkO8pmxuQL_0*X&X9@tszTe&dY^o8DoH+W)6TkU!{|f-d zucik8K#j-at$U7ac&)yrw(G(v+1D^%X-_oKexc~|z&2o8`~(1inTzdgD5K*U-Ze2| z47GOCTVo$ho!tAtu}uIn018np8&wEEqPutLU4PpTbRPo<4CzExH39p7vh;rX*vY=L z?+*0?n2HKYsfNJv8hbJGL1hvZ>p(|GM{LcbZNFD*c)4xWqGdTKXsRIOeX_>WQs{Z` z@x`woLeZ>5K-qqvXHR@C^}2wEf_H+uvOKW+ChB;@_g>z#6BVMQTqEszc57GTXT=d8 zL1ChYk%#g27yiTmWxn;r8 zQ^yC#!p1Gx+V$jfPz7dN?& zCr=};q>z_WI5qkzE{vZH?WxAmmVejkpF4l@<4IpzfWBz!O0KH};#~Fw&Sg&&trVyo zP$TR&IeiSrhks!!mK_HGZtqI>y$u}pS|TWfltiO?UnyXmA1@e=2;RHZa4Cj@cGjC@ zv)B@3@E`(OGDTks8_@YLbm9Q;-jPDVhRB?`T5lu*D^_&WYH_M%aAd$v;D2G@1Iu2S z(D7D#rADNeE^SFvB0#O3^{I+TL%@ewx!TYPR0mMEqM;U^<<#ercuI}svV~zok`QFL zlqDjDm@E@z_FOmem(+`3@1;Dc^JK9vWG9aTVR))dSR>%&?)-GA1XUaMCFz8VkYb)BPL zi72XxP8O`x_T&K-mrdI%c0L3FF9Y5ptLw9s3t2#QFHb@-Yl4)e&>=fXsTBJprL&@y zjrSn%Y!B`cUkK>|`;AH>RBN+kZ86NHwX}lR;OSF=2lT?M^v&&k@wYz>U7FQ(-{Cn( zoQEA!7>Z(V7=PIHZG-n8OxZV982FhPIq{cc=P!FP_--Y}$7e|z+CLU{roXIe!oPnl zBV=vZ?1hKPT=&@#I#I3e)XGijldu15;2R&jf9Wg$-94vY6ae*_hMN~IYi?2$<%(A- z!zf(w1*u^eY=4iO{clFs@ezP509P1=rK|u@gKPUI)qkkMF#p_?_ku4+AZq*dBymIj zFXewDA7BDFxU!7^001R)MObuXVRU6WV{&C-bY%cCFflYOFgYzSHB>P$IyE;sH8?FW zH##sdyvITA0000bbVXQnWMOn=I&E)cX=ZrgFgH3d VFwL6zQVak9002ovPDHLkV1nS93FrU- diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png old mode 100644 new mode 100755 index bfa42f0e7b91d006d22352c9ff2f134e504e3c1d..2ce117ca53b3ecb0b64e63fb85d9f83794d2df78 GIT binary patch delta 3576 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png old mode 100644 new mode 100755 index 324e72cdd7480cb983fa1bcc7ce686e51ef87fe7..7c1e264b99e22c34acb1097a1443d41cca3de14d GIT binary patch literal 6608 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 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..047ec34a7b19f889c4d0a4d629d69bd400910450 GIT binary patch literal 10248 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 H{{DXe>@T7r literal 0 HcmV?d00001 From 227f22eb4867ae3a475f57f23bcf4a2433c51971 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Fri, 20 May 2016 19:12:04 +0300 Subject: [PATCH 10/18] chat name/load messages on [:navigate-to :chat id]/ other Former-commit-id: ae1918a2aed109400cda0e376fec6d37cdb5d79f --- .../main/res/drawable-hdpi/icon_ok_purple.png | Bin 0 -> 644 bytes .../main/res/drawable-mdpi/icon_ok_purple.png | Bin 0 -> 504 bytes .../res/drawable-xhdpi/icon_ok_purple.png | Bin 0 -> 931 bytes .../res/drawable-xxhdpi/icon_ok_purple.png | Bin 0 -> 1520 bytes .../res/drawable-xxxhdpi/icon_ok_purple.png | Bin 0 -> 2055 bytes src/syng_im/android/core.cljs | 4 +- src/syng_im/chat/handlers.cljs | 14 ++- .../chats_list/views/chat_list_item.cljs | 2 +- src/syng_im/components/react.cljs | 8 +- src/syng_im/group_settings/handlers.cljs | 95 ++++++++---------- src/syng_im/group_settings/screen.cljs | 93 ++++++++++------- .../group_settings/styles/chat_name_edit.cljs | 19 ---- .../group_settings/styles/group_settings.cljs | 46 ++++----- src/syng_im/group_settings/subs.cljs | 11 +- .../group_settings/views/chat_name_edit.cljs | 31 ------ src/syng_im/group_settings/views/member.cljs | 2 +- src/syng_im/handlers.cljs | 8 +- src/syng_im/navigation/handlers.cljs | 8 +- src/syng_im/new_group/handlers.cljs | 2 +- src/syng_im/new_group/subs.cljs | 8 +- src/syng_im/participants/subs.cljs | 3 + .../views/{create.cljs => add.cljs} | 19 ++-- src/syng_im/participants/views/remove.cljs | 17 ++-- src/syng_im/profile/screen.cljs | 2 +- src/syng_im/subs.cljs | 4 + src/syng_im/utils/subs.cljs | 10 ++ 26 files changed, 190 insertions(+), 216 deletions(-) create mode 100644 android/app/src/main/res/drawable-hdpi/icon_ok_purple.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_ok_purple.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_ok_purple.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_ok_purple.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_ok_purple.png delete mode 100644 src/syng_im/group_settings/styles/chat_name_edit.cljs delete mode 100644 src/syng_im/group_settings/views/chat_name_edit.cljs create mode 100644 src/syng_im/participants/subs.cljs rename src/syng_im/participants/views/{create.cljs => add.cljs} (66%) create mode 100644 src/syng_im/utils/subs.cljs diff --git a/android/app/src/main/res/drawable-hdpi/icon_ok_purple.png b/android/app/src/main/res/drawable-hdpi/icon_ok_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..b28a5ca6d021ccc79a439897407957341a607a51 GIT binary patch literal 644 zcmV-~0(Px%K1oDDR7efAl+RBSQ4q)9ESQude*he+mtC&}ymBNVrWY!vP$VQY2niv^AU8R& zYm71e02(Z{TOe4YjVF&ilW^_Z3)RHGqCwc_cecE`4aGuj-(jb3_RaURGxIt^ba~|+ z8Bi0H5{Y9_|V>0JA?Z96jt zxsKctN~E+HdUOzpn#p+lGKkLvJwu@3Zpf8V_Gd%~{>w5b?|A7j2)Ax861A=bu^tr) zs;63!IVD5_0pC%A7{2WED%b^R2X;=MLFwG-RdW{B*S==fIIVd10}#JeYOMOh`&25a zrsWMP;K)oPNPN5wh~MIG$~FPx$vPnciR45gtlF2UvaTLej`?XUl5<77u#J(il)pBwY2SO|tHzLGR;ou~+8br9b znIh4PKR{*9E+Up0y9lv6S)0!E`HiGh(?nWx`Tgd-@B8Gv@9zQp<8w`%#)&q$M@L|! zoVDrm_-D`iIuVs4W5W@Fmd7s=RCrwnpfcXdsR2zE7H&tbsmnwSU)?%{cX47i87o?> z*;iq8v^b|E!Hdrg1f>XgBrsOlWX-(}%cB*?VX~^KZXzf_#6ygN%GTce8~;RKqe&7O z{ee)Y4)J=m4IRSs2hq%I354i1%sDNmUv4T}i*~s&6vQ=qoT7R)iF;Cv2#R1fTN(y4 zZiBUqJW$V{un09;a@yp&K!G@UlKTGUl?bR15ck0lWohooybIL$@2qVof1VpRMgT_g z(W+>dYxU&H%vl`Af0000|00001b5ch_0Itp) z=>Px&T}ebiR7efQmQ73(K@`W|n?(gKM$dZTptM{(crh9cYBWUS7eT^D7Zi*!8e8fozW3` z^`O6HRe%!4*gl)X^EAvXDbuv7f-hMtoZQa^4!dCxSX-dI{B=Qr5>e{_fecf=l*|TY zra-{UdWWw|HVU?6X2d#3AWs2Au@iAQLr=i_H;nZcFu7gGnD3>`SGSt;byQ$x8pKCh}Bppm+tdnx-iqjbpzJsRi)~}XN zDxIzaoeQ8uoqKxHKq<0q2!tvIl-*Lw^e&Umda$C6)<5HZ5dt>R@&ER5*VoO`#td7{ zUNF>Ezg!qOeny0(Ad{Qky4}DT+VY{E*UvLTYKF>6Ocj^;PEw>sltzCrEi_iW5-@U(1tX*& zMtdiVr+)o?DFAmOgA;nY|CQ=nwQ~60k5V)8dDlt<{0B+LLJ72M>kR+^002ovPDHLk FV1m&BuO$Eg literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_ok_purple.png b/android/app/src/main/res/drawable-xxhdpi/icon_ok_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..b2942242644f2d7dd118965e582153e77c3e271f GIT binary patch literal 1520 zcmVPx)s!2paRA>d=nR`r|RTRMQ?TfE4hA_8GlWy`@W^4RsF<~Y;0|Ud54KSnQAwyye zCL=^P%`p0(Mj*s3KF|=2N|_=I<~GJgbci}1VVR2>>9@qej3nwtr3?mrzW_ zURs($i{C%@-gC}(?)lwwUtdee|KREDWJ+HQg|A?>wc8qo-ms5|U6)#zS|0nV1~WC7 zkGdE+$QUayTgA@?2AE2Mqf%wHm8N>}O-5Wb^0+A_-MVx`aYhE6Ta{p~^+Rt1P_-ON zssqq*-F8Fif<-48L}Lk4j;0Cwni(Mnc=18j6f@VY?VdTwGmI8FLbWxB?=r%kn0_BXrYhwD%j>XF{Gw7Rvr1ps z>IH>1Q3-}n#~Q>BA-)PZh*zDGpV=BkR%!Ltf4$`Mji>`dDA@fzhTX5+U%)7%lwKAz z@!7^|-8k2Vr-+0cFSGVxb1R%vW&Hl>Pbw0ZUG~yuE8ixHrXoVwhQ&4rwuBcjWa?6U zj5fQlcJl$$6NJLE#yXpCtg%m8&cKQPnEO3S|Iny4J4z0vjRxT-pb0|R zhsAF2pT{$XHT5-7CgtsaapN@4CRn)}tg~S_!Ok4#pwoxtFM{$a73hxgTEpLR`BLjR zy)DzTC%}I$_gzW`k`fd1c30gy!?jt0Lg5}s;yCXMg+AbFlg1pZ-_&$1aKLyG?~Gk{+&lgwRY#!De#%i^9d)_ z7n?R}^D`=w?R=ZiG@e~?f1TkqLKUy`+(3ZaY{b!bs_{xZ&qk6Xl+8KSvltYNXy0-{ zVH_SXY*f_gUsh0Z1nYhu#g>+RGjLArpe z7z)el9ykQku30khEnyRQblf^|8rP4n4xy~piC$QjnZ7!y4ZeHV$Epi+YqmHf*>aSg zH70isQ;4=Tii`h<0;8@?(HG$6gYTM}{)r=VVO6X0+^i`nGag8Z~L)ljq&P#6Oj43+K=z+rPc zY}ZBD_V<8;ugnK2$|#c{bseFA9d8;WyLhpx6Z&%nzk=fI0zC z#VZMgaW2?Ae1pfoWP}vG5k{cTR~N8NNf%7jeJc%xaRmfJBU~4{jj@HW_`kw-Fb_`A zP3eXb9GGD2!)+537ADjP)Px+!AV3xRA>e5n+t4HRTzNJIqfzO5S6DO;s#^wCK@z~M$tWaDu~Jywr(hD3^7D` ztX+&I2IJZdh7l!^L}l&DOu_JyhdkD4j7FnIjcYqLM$8mJ0m0$At-a^?pT%45+TPyV z(T#QEHrYMrKmU3B-~G??-XV1Dibw!QOdSM?+cz|f7JR}RNl7Et=C7XQ4K|qs3kFl% z@lN9yzh9`Oh^_Q?w(fIOwhRrnf6xN5Ry2+Ew)vclvFTk<7|UtzY~ADh=;RP7q(KR2 z``gXqkiWx;7|W2t09bh~XWDj4Aq~1Q$WeZBd^>HcWen-1aHL^?a%l9h#K-2ZO6?d_ z9%S3(y4fqVLAR2J!$C2G=ALcyeF7eZ2MwSai)RAsKu)k`LK?nGKPyljN zHcaefv<^HXEgTT3j6*?~tt>XCZ{hL*KL%A>8gHSr(+S;XsuV=HFoy%b7Y(KQtz!Cs z_Mn=LO_K!HS*IQjdO-?@LmIFiWHq0-6|r{iIVqwy$lo!Aq51jZ(u@y-bp|9L`v%u! z!H;0JV#&br+b+vOLjwkoz3h03fcf4E-5P3UcL~f^0>-4+VAR>W zr-a4^#4Pr4dE*p6^1(VsB^-hcYT$5OaSzB=*)+A2cGiI{lej^VF77$7G%hfd=xZYB zNz>xGi`mOvseXZPAJ{~xQQ^X1s2^j1W6E%ZOP7h1qI?oN=O@!y!bo zw9u&ADazE|4?IU14m|lzuzAUqz~Ri|#)GUCuG^8oj=@wuR_0*`#9eSO zd9ui)-xm<}Fc24js?F}{0%ONuwi=^oC&v7k^a+D0eZQiv3Wa{(#kN;??ts@awQAwO z_TlkZ!QuS+wFlYE4R!HZ%IhqpH@AX|C;EI(#We2E?2wdv#y(HIsBU0b>9F7WN6Fk9WE zR32;}yo8{Ig(dpKO1eEs59wmnmiiolqPzyWCF130? z!##dXkE($Kx!MpTkMt%S-m(CoDs%lJ$`GtLS+{r7TnQk}Lc+Pd(pR!v9?Q#aX}FjA zg(FazVwZ+Z=f4Dz1x2MgnB98!>H=gl*XP6Apq=pK66LCc1zL8?>9$=C2b0y2%c~@> zwz%#SsBi?%kVh)%ayYQJS^#e!>XdY2k=_M}A~Fu(Xq5^Cow@DJZimy!6m^x#64R?H z-1k$8J_9ekUX;n*VZgiu>zsK-CHl|hbYd+J4ANC)u659v%GFc=nRX1BlD;%Q9}8;q z<#ejcJr4+!9)w-_2sxdA9OG7uH1ms0X!4;x|%w{la_d!-P@o` z1oErNC)Kf<8y=*Ba7Zm2g7DnFhQr(2%|Lh`y&hrmmedg0Fk^)_i+d|T3V5NcZcu{V z?0N_>|3LsfJSZt73d@XtkOt2&nDk$TB=&)z8z5dEyd!#*U{tB5Zh*4_AZ=EoE9zLw z-46?h9Z&@a$~jJx0SixgH7T}H4TD+b7PS)W37^|-QvmeQ=!{B zOD+#A0xxQ?W_E!w?OQpWzL1A_kXUJCPxxV=Z&N8A-=l=E+tI2bS*_ zpsVLzZ8+Q>Sr6igd=R!;+*J@LC1s6X%GuS^!I(TDD_3I_YlRC zw;1gwTzmLxS}G402G0XEv<3b=2i-F%oQ_lm`e$Jgm}@Yl{Unw5hp=iuys><<3f~d$ z=lil)HJ-!KYDmtqb-JHpRc0*9i8uxYSCsWkay!zDS_orGjF$WOFZegpf%BYVvZ(r*72oP@|KZQAQ1%r#}J>_ zTL*FFFW3?O0~3-3A1^hC`TP65#~vgaw(RAUGl@i#1E^1kvaolIPq9Rt8BcJy9ajv9 z7qZl-JB87ZZ0K&k@_6Wlf7cR}S-eJnJT$F;ORl(!NzLOQQu>kq3)sa4zW9RK>NlL2 zlx0{wwMnWQFX5PYkZ5c{>9l4-NDiN+{+G2RlEln-g~M%#DIi`TA7iu_<-iL02Q5m- le7Ynx^4P>PUAy9!z<+~=w3IT#vVQ;o002ovPDHLkV1kJJ-A@1j literal 0 HcmV?d00001 diff --git a/src/syng_im/android/core.cljs b/src/syng_im/android/core.cljs index a7c6315b1e..3ab9a35ad5 100644 --- a/src/syng_im/android/core.cljs +++ b/src/syng_im/android/core.cljs @@ -12,10 +12,9 @@ [syng-im.chat.screen :refer [chat]] [syng-im.chats-list.screen :refer [chats-list]] [syng-im.new-group.screen :refer [new-group]] - [syng-im.participants.views.create :refer [new-participants]] + [syng-im.participants.views.add :refer [new-participants]] [syng-im.participants.views.remove :refer [remove-participants]] [syng-im.group-settings.screen :refer [group-settings]] - [syng-im.group-settings.views.chat-name-edit :refer [chat-name-edit]] [syng-im.profile.screen :refer [profile my-profile]] [syng-im.utils.utils :refer [toast]] [syng-im.utils.encryption])) @@ -43,7 +42,6 @@ :chat-list [chats-list] :new-group [new-group] :group-settings [group-settings] - :chat-name-edit [chat-name-edit] :contact-list [contact-list] :chat [chat] :profile [profile] diff --git a/src/syng_im/chat/handlers.cljs b/src/syng_im/chat/handlers.cljs index 67acc9a6fa..73f2a2ece6 100644 --- a/src/syng_im/chat/handlers.cljs +++ b/src/syng_im/chat/handlers.cljs @@ -187,7 +187,8 @@ ((enrich add-commands)) ((enrich clear-input)) ((enrich clear-staged-commands)) - ((after send-message!)) + ;; todo uncomment once + ;((after send-message!)) ((after save-message-to-realm!)) ((after save-commands-to-realm!)) ((after handle-commands)))) @@ -283,10 +284,13 @@ (defmethod nav/preload-data! :chat [{:keys [current-chat-id] :as db} [_ _ id]] - (-> db - (assoc :current-chat-id (or id current-chat-id)) - load-messages! - init-chat)) + (let [messages (get-in db [:chats current-chat-id :messages])] + (if (seq messages) + (-> db + (assoc :current-chat-id (or id current-chat-id)) + load-messages! + init-chat) + db))) (defn prepare-chat [{:keys [contacts] :as db} [_ contcat-id]] diff --git a/src/syng_im/chats_list/views/chat_list_item.cljs b/src/syng_im/chats_list/views/chat_list_item.cljs index 3673701ccc..ddc6c87b9b 100644 --- a/src/syng_im/chats_list/views/chat_list_item.cljs +++ b/src/syng_im/chats_list/views/chat_list_item.cljs @@ -10,7 +10,7 @@ (defn chat-list-item [{:keys [chat-id] :as chat}] [touchable-highlight - {:on-press #(dispatch [:show-chat chat-id :push])} + {:on-press #(dispatch [:navigate-to :chat chat-id])} ;; TODO add [photo-path delivery-status new-messages-count online] values to chat-obj [view [chat-list-item-inner-view (merge chat {:photo-path nil diff --git a/src/syng_im/components/react.cljs b/src/syng_im/components/react.cljs index 58c99aa6e4..e3f1289e00 100644 --- a/src/syng_im/components/react.cljs +++ b/src/syng_im/components/react.cljs @@ -35,9 +35,11 @@ (def picker-item (r/adapt-react-class (.-Item (.-Picker js/React)))) -(defn icon [n style] - [image {:source {:uri (keyword (str "icon_" (name n)))} - :style style}]) +(defn icon + ([n] (icon n {})) + ([n style] + [image {:source {:uri (keyword (str "icon_" (name n)))} + :style style}])) (def platform (.. js/React -Platform -OS)) diff --git a/src/syng_im/group_settings/handlers.cljs b/src/syng_im/group_settings/handlers.cljs index 0871624cb1..58dbda4067 100644 --- a/src/syng_im/group_settings/handlers.cljs +++ b/src/syng_im/group_settings/handlers.cljs @@ -1,72 +1,59 @@ (ns syng-im.group-settings.handlers - (:require [re-frame.core :refer [register-handler debug dispatch]] + (:require [re-frame.core :refer [register-handler debug dispatch after]] [syng-im.persistence.realm :as r] - [syng-im.models.messages :refer [clear-history]])) + [syng-im.models.messages :refer [clear-history]] + [clojure.string :as s])) -(defn set-chat-name [db] - (let [chat-id (:current-chat-id db) - name (:new-chat-name db)] - (r/write (fn [] - (-> (r/get-by-field :chats :chat-id chat-id) - (r/single) - (aset "name" name)))) - (assoc-in db [:chats chat-id :name] name))) +(defn save-chat-property! + [db-name property-name] + (fn [{:keys [current-chat-id] :as db} _] + (let [property (db-name db)] + (r/write (fn [] + (-> (r/get-by-field :chats :chat-id current-chat-id) + (r/single) + (aset (name property-name) property))))))) -(defn set-chat-color [db] - (let [chat-id (:current-chat-id db) - color (:new-chat-color db)] - (r/write (fn [] - (-> (r/get-by-field :chats :chat-id chat-id) - (r/single) - (aset "color" color)))) - (assoc-in db [:chats chat-id :color] color))) +(defn update-chat-property + [db-name property-name] + (fn [{:keys [current-chat-id] :as db} _] + (let [property (db-name db)] + (assoc-in db [:chats current-chat-id property-name] property)))) (defn delete-chat [chat-id] (r/write - (fn [] - (-> (r/get-by-field :chats :chat-id chat-id) - (r/single) - (r/delete)))) + (fn [] + (-> (r/get-by-field :chats :chat-id chat-id) + (r/single) + (r/delete)))) ;; TODO temp. Update chat in db atom (dispatch [:initialize-chats])) +(defn prepare-chat-settings + [{:keys [current-chat-id] :as db} _] + (let [{:keys [name color]} (-> db + (get-in [:chats current-chat-id]) + (select-keys [:name :color]))] + (-> db + (assoc :new-chat-name name + :new-chat-color color + :group-settings {})))) + (register-handler :show-group-settings - (fn [db _] - (let [chat-id (:current-chat-id db) - chat-name (get-in db [:chats chat-id :name]) - chat-color (get-in db [:chats chat-id :color]) - db (assoc db - :new-chat-name chat-name - :new-chat-color chat-color - :group-settings-show-color-picker false - :group-settings-selected-member nil)] - (dispatch [:navigate-to :group-settings]) - db))) + (after (fn [_ _] (dispatch [:navigate-to :group-settings]))) + prepare-chat-settings) (register-handler :set-chat-name - (fn [db [action]] - (set-chat-name db))) + (after (save-chat-property! :new-chat-name :name)) + (update-chat-property :new-chat-name :name)) (register-handler :set-chat-color - (fn [db [action]] - (set-chat-color db))) - -(register-handler :set-new-chat-name - (fn [db [action name]] - (assoc db :new-chat-name name))) - -(register-handler :set-new-chat-color - (fn [db [action color]] - (assoc db :new-chat-color color))) - -(register-handler :select-group-chat-member - (fn [db [action identity]] - (assoc db :group-settings-selected-member identity))) - -(register-handler :set-group-settings-show-color-picker - (fn [db [action show?]] - (assoc db :group-settings-show-color-picker show?))) + (after (save-chat-property! :new-chat-color :color)) + (update-chat-property :new-chat-color :color)) (register-handler :clear-history - (fn [db [action]] + (fn [db _] (clear-history (:current-chat-id db)))) + +(register-handler :group-settings + (fn [db [_ k v]] + (assoc-in db [:group-settings k] v))) diff --git a/src/syng_im/group_settings/screen.cljs b/src/syng_im/group_settings/screen.cljs index 7e06fd98af..c74c74c020 100644 --- a/src/syng_im/group_settings/screen.cljs +++ b/src/syng_im/group_settings/screen.cljs @@ -13,13 +13,14 @@ touchable-highlight]] [syng-im.components.toolbar :refer [toolbar]] [syng-im.group-settings.styles.group-settings :as st] - [syng-im.group-settings.views.member :refer [member-view]])) + [syng-im.group-settings.views.member :refer [member-view]] + [clojure.string :as s])) (defn remove-member [{:keys [whisper-identity]}] (dispatch [:chat-remove-member whisper-identity])) (defn close-member-menu [] - (dispatch [:select-group-chat-member nil])) + (dispatch [:set :group-settings-selected-member nil])) (defview member-menu [] [member [:group-settings-selected-member]] @@ -58,15 +59,15 @@ subtitle])]]]) (defn close-chat-color-picker [] - (dispatch [:set-group-settings-show-color-picker false])) + (dispatch [:group-settings :show-color-picker false])) (defn set-chat-color [] (close-chat-color-picker) (dispatch [:set-chat-color])) (defview chat-color-picker [] - [show-color-picker [:get :group-settings-show-color-picker] - new-color [:get :new-chat-color]] + [show-color-picker [:group-settings :show-color-picker] + new-color [:get :new-chat-color]] [modal {:animated false :transparent false :onRequestClose close-chat-color-picker} @@ -74,11 +75,11 @@ :on-press close-chat-color-picker} [view st/modal-color-picker-inner-container [picker {:selectedValue new-color - :onValueChange #(dispatch [:set-new-chat-color %])} - [picker-item {:label "Blue" :value "#7099e6"}] - [picker-item {:label "Purple" :value "#a187d5"}] - [picker-item {:label "Green" :value "green"}] - [picker-item {:label "Red" :value "red"}]] + :onValueChange #(dispatch [:set :new-chat-color %])} + [picker-item {:label "Blue" :value "#7099e6"}] + [picker-item {:label "Purple" :value "#a187d5"}] + [picker-item {:label "Green" :value "green"}] + [picker-item {:label "Red" :value "red"}]] [touchable-highlight {:on-press set-chat-color} [text {:style st/modal-color-picker-save-btn-text} "Save"]]]]]) @@ -88,7 +89,7 @@ [view {:style (st/chat-color-icon chat-color)}]) (defn show-chat-color-picker [] - (dispatch [:set-group-settings-show-color-picker true])) + (dispatch [:group-settings :show-color-picker true])) (defn settings-view [] ;; TODO implement settings handlers @@ -105,22 +106,22 @@ {:icon :muted :icon-style {:width 18 :height 21}})) - {:icon :close-gray - :icon-style {:width 12 - :height 12} - :title "Clear history" - :handler #(dispatch [:clear-history])} - {:icon :bin - :icon-style {:width 12 - :height 18} - :title "Delete and leave" - :handler #(dispatch [:leave-group-chat])}]] + {:icon :close-gray + :icon-style {:width 12 + :height 12} + :title "Clear history" + :handler #(dispatch [:clear-history])} + {:icon :bin + :icon-style {:width 12 + :height 18} + :title "Delete and leave" + :handler #(dispatch [:leave-group-chat])}]] [view st/settings-container (for [setting settings] ^{:key setting} [setting-view setting])])) (defview chat-icon [] - [name [:chat :name] + [name [:chat :name] color [:chat :color]] [view (st/chat-icon color) [text {:style st/chat-icon-text} (first name)]]) @@ -129,24 +130,44 @@ [toolbar {:title "Chat settings" :custom-action [chat-icon]}]) +(defn focus [] + (dispatch [:set ::name-input-focused true])) + +(defn blur [] + (dispatch [:set ::name-input-focused false])) + +(defn save [] + (dispatch [:set-chat-name])) + +(defview chat-name [] + [name [:chat :name] + new-name [:get :new-chat-name] + focused? [:get ::name-input-focused]] + [view + [text {:style st/chat-name-text} "Chat name"] + [view (st/chat-name-value-container focused?) + [text-input {:style st/chat-name-value + :ref #(when (and % focused?) (.focus %)) + :on-change-text #(dispatch [:set :new-chat-name %]) + :on-focus focus + :on-blur blur} + name] + (if (or focused? (not= name new-name)) + [touchable-highlight {:style st/chat-name-btn-edit-container + :on-press save} + [view [icon :ok-purple st/add-members-icon]]] + [touchable-highlight {:style st/chat-name-btn-edit-container + :on-press focus} + [text {:style st/chat-name-btn-edit-text} "Edit"]])]]) + (defview group-settings [] - [chat-name [:chat :name] - selected-member [:group-settings-selected-member] - show-color-picker [:get :group-settings-show-color-picker]] + [selected-member [:group-settings-selected-member] + show-color-picker [:group-settings :show-color-picker]] [view st/group-settings [new-group-toolbar] [scroll-view st/body - [text {:style st/chat-name-text} - "Chat name"] - [view st/chat-name-value-container - [text {:style st/chat-name-value} - chat-name] - [touchable-highlight {:style st/chat-name-btn-edit-container - :on-press show-chat-name-edit} - [text {:style st/chat-name-btn-edit-text} - "Edit"]]] - [text {:style st/members-text} - "Members"] + [chat-name] + [text {:style st/members-text} "Members"] [touchable-highlight {:on-press #(dispatch [:show-add-participants])} [view st/add-members-container [icon :add-gray st/add-members-icon] diff --git a/src/syng_im/group_settings/styles/chat_name_edit.cljs b/src/syng_im/group_settings/styles/chat_name_edit.cljs deleted file mode 100644 index 0a5afb59d3..0000000000 --- a/src/syng_im/group_settings/styles/chat_name_edit.cljs +++ /dev/null @@ -1,19 +0,0 @@ -(ns syng-im.group-settings.styles.chat-name-edit - (:require [syng-im.components.styles :refer [font - color-white - text1-color]])) - -(def save-action-icon - {:width 18 - :height 14}) - -(def chat-name-container - {:flex 1 - :flexDirection :column - :backgroundColor color-white}) - -(def chat-name-input - {:marginLeft 12 - :fontSize 14 - :fontFamily font - :color text1-color}) diff --git a/src/syng_im/group_settings/styles/group_settings.cljs b/src/syng_im/group_settings/styles/group_settings.cljs index 092ab7387e..118caf7121 100644 --- a/src/syng_im/group_settings/styles/group_settings.cljs +++ b/src/syng_im/group_settings/styles/group_settings.cljs @@ -24,17 +24,17 @@ :backgroundColor color-white}) (def modal-member-name - {:color text2-color - :fontFamily font - :fontSize 14 - :lineHeight 20}) + {:color text2-color + :fontFamily font + :fontSize 14 + :lineHeight 20}) (def modal-remove-text - {:margin 10 - :color text1-color - :fontFamily font - :fontSize 14 - :lineHeight 20}) + {:margin 10 + :color text1-color + :fontFamily font + :fontSize 14 + :lineHeight 20}) (def modal-color-picker-inner-container {:borderRadius 10 @@ -42,12 +42,12 @@ :backgroundColor color-white}) (def modal-color-picker-save-btn-text - {:margin 10 - :alignSelf :center - :color text1-color - :fontFamily font - :fontSize 14 - :lineHeight 20}) + {:margin 10 + :alignSelf :center + :color text1-color + :fontFamily font + :fontSize 14 + :lineHeight 20}) (def chat-members-container {:marginBottom 10}) @@ -85,14 +85,14 @@ :fontSize 14 :lineHeight 20}) -(def chat-name-value-container +(defn chat-name-value-container [focused?] {:flexDirection :row :marginLeft 16 :height 56 :alignItems :center :justifyContent :center - :borderBottomWidth 1 - :borderBottomColor separator-color}) + :borderBottomWidth 2 + :borderBottomColor (if focused? color-purple separator-color)}) (def chat-name-value {:flex 1 @@ -105,11 +105,11 @@ :justifyContent :center}) (def chat-name-btn-edit-text - {:marginTop -1 - :color text2-color - :fontFamily font - :fontSize 16 - :lineHeight 20}) + {:marginTop -1 + :color text2-color + :fontFamily font + :fontSize 16 + :lineHeight 20}) (def members-text {:marginTop 24 diff --git a/src/syng_im/group_settings/subs.cljs b/src/syng_im/group_settings/subs.cljs index 8ef774b5f6..844a7088af 100644 --- a/src/syng_im/group_settings/subs.cljs +++ b/src/syng_im/group_settings/subs.cljs @@ -1,14 +1,13 @@ (ns syng-im.group-settings.subs (:require-macros [reagent.ratom :refer [reaction]]) - (:require [re-frame.core :refer [register-sub]] - [syng-im.models.contacts :refer [contact-by-identity]])) + (:require [re-frame.core :refer [register-sub]])) (register-sub :group-settings-selected-member (fn [db [_]] (reaction (let [identity (get @db :group-settings-selected-member)] - (contact-by-identity identity))))) + (get-in @db [:contacts identity]))))) -(register-sub :group-settings-show-color-picker - (fn [db [_]] - (reaction (get @db :group-settings-show-color-picker)))) +(register-sub :group-settings + (fn [db [_ k]] + (reaction (get-in @db [:group-settings k])))) diff --git a/src/syng_im/group_settings/views/chat_name_edit.cljs b/src/syng_im/group_settings/views/chat_name_edit.cljs deleted file mode 100644 index 7ba34e6dd7..0000000000 --- a/src/syng_im/group_settings/views/chat_name_edit.cljs +++ /dev/null @@ -1,31 +0,0 @@ -(ns syng-im.group-settings.views.chat-name-edit - (:require-macros [syng-im.utils.views :refer [defview]]) - (:require [reagent.core :as r] - [re-frame.core :refer [subscribe dispatch dispatch-sync]] - [syng-im.components.react :refer [view text-input]] - [syng-im.components.toolbar :refer [toolbar]] - [syng-im.group-settings.styles.chat-name-edit :as st] - [syng-im.components.styles :refer [toolbar-background2 - text2-color]])) - -(defn save-group-chat-name [] - (dispatch [:set-chat-name]) - (dispatch [:navigate-back])) - -(defn chat-name-edit-toolbar [chat-name] - [toolbar {:background-color toolbar-background2 - :title "Edit chat name" - ;; TODO change to dark 'ok' icon - :action {:image {:source {:uri :icon_ok} - :style st/save-action-icon} - :handler save-group-chat-name}}]) - -(defview chat-name-edit [] - [new-chat-name [:get :new-chat-name]] - [view st/chat-name-container - [chat-name-edit-toolbar] - [text-input {:style st/chat-name-input - :autoFocus true - :placeholderTextColor text2-color - :onChangeText #(dispatch [:set-new-chat-name %])} - new-chat-name]]) diff --git a/src/syng_im/group_settings/views/member.cljs b/src/syng_im/group_settings/views/member.cljs index 6584724755..593a8c7eab 100644 --- a/src/syng_im/group_settings/views/member.cljs +++ b/src/syng_im/group_settings/views/member.cljs @@ -38,6 +38,6 @@ [text {:style st/role-text} role])] [touchable-highlight - {:on-press #(dispatch [:select-group-chat-member whisper-identity])} + {:on-press #(dispatch [:set :group-settings-selected-member whisper-identity])} [view st/more-btn [icon :more-vertical st/more-btn-icon]]]]) diff --git a/src/syng_im/handlers.cljs b/src/syng_im/handlers.cljs index 5ca72c1d61..3123cf44b6 100644 --- a/src/syng_im/handlers.cljs +++ b/src/syng_im/handlers.cljs @@ -63,6 +63,11 @@ (fn [db [_ k v]] (assoc db k v)))) +(register-handler :set-in + (debug + (fn [db [_ path v]] + (assoc-in db path v)))) + (register-handler :initialize-db (fn [_ _] (assoc app-db @@ -279,12 +284,13 @@ (dispatch [:initialize-chats]) db)) + (register-handler :chat-remove-member (fn [db [action]] (let [chat-id (:current-chat-id db) identity (:group-settings-selected-member db) db (chat-remove-member db)] - (dispatch [:select-group-chat-member nil]) + (dispatch [:set :group-settings-selected-member nil]) ;; TODO fix and uncomment (api/group-remove-participant chat-id identity) (removed-participant-msg chat-id identity) diff --git a/src/syng_im/navigation/handlers.cljs b/src/syng_im/navigation/handlers.cljs index 36dd8a768d..6166d13ec6 100644 --- a/src/syng_im/navigation/handlers.cljs +++ b/src/syng_im/navigation/handlers.cljs @@ -27,6 +27,7 @@ (push-view db view-id))) (register-handler :navigation-replace + (enrich preload-data!) (fn [db [_ view-id]] (replace-view db view-id))) @@ -46,13 +47,6 @@ (push-view :new-group) (assoc :new-group #{}))))) -(register-handler :show-chat - (fn [db [_ chat-id nav-type]] - (let [update-view-id-fn (if (= :replace nav-type) replace-view push-view)] - (-> db - (update-view-id-fn :chat) - (assoc :current-chat-id chat-id))))) - (register-handler :show-contacts (fn [db _] (push-view db :contact-list))) diff --git a/src/syng_im/new_group/handlers.cljs b/src/syng_im/new_group/handlers.cljs index 3823eb1c2e..949466b268 100644 --- a/src/syng_im/new_group/handlers.cljs +++ b/src/syng_im/new_group/handlers.cljs @@ -56,7 +56,7 @@ (defn show-chat! [{:keys [new-group-id]} _] - (dispatch [:show-chat new-group-id :replace])) + (dispatch [:navigation-replace :chat new-group-id])) (defn enable-creat-buttion [db _] diff --git a/src/syng_im/new_group/subs.cljs b/src/syng_im/new_group/subs.cljs index 62fc941747..fd33058b1e 100644 --- a/src/syng_im/new_group/subs.cljs +++ b/src/syng_im/new_group/subs.cljs @@ -1,9 +1,7 @@ (ns syng-im.new-group.subs (:require-macros [reagent.ratom :refer [reaction]]) - (:require [re-frame.core :refer [register-sub]])) + (:require [re-frame.core :refer [register-sub]] + [syng-im.utils.subs :as u])) (register-sub :is-contact-selected? - (fn [db [_ id]] - (-> (:selected-contacts @db) - (contains? id) - (reaction)))) + (u/contains-sub :selected-contacts)) diff --git a/src/syng_im/participants/subs.cljs b/src/syng_im/participants/subs.cljs new file mode 100644 index 0000000000..810a9ff3f6 --- /dev/null +++ b/src/syng_im/participants/subs.cljs @@ -0,0 +1,3 @@ +(ns syng-im.participants.subs) + +() diff --git a/src/syng_im/participants/views/create.cljs b/src/syng_im/participants/views/add.cljs similarity index 66% rename from src/syng_im/participants/views/create.cljs rename to src/syng_im/participants/views/add.cljs index 20a84dfbfa..826579fcd1 100644 --- a/src/syng_im/participants/views/create.cljs +++ b/src/syng_im/participants/views/add.cljs @@ -1,4 +1,5 @@ -(ns syng-im.participants.views.create +(ns syng-im.participants.views.add + (:require-macros [syng-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch]] [syng-im.resources :as res] [syng-im.components.react :refer [view list-view list-item]] @@ -19,12 +20,10 @@ [row _ _] (list-item [participant-contact row])) -(defn new-participants [] - (let [contacts (subscribe [:all-new-contacts])] - (fn [] - (let [contacts-ds (to-datasource @contacts)] - [view st/participants-container - [new-participants-toolbar] - [list-view {:dataSource contacts-ds - :renderRow new-participants-row - :style st/participants-list}]])))) +(defview new-participants [] + [contacts [:all-new-contacts]] + [view st/participants-container + [new-participants-toolbar] + [list-view {:dataSource (to-datasource contacts) + :renderRow new-participants-row + :style st/participants-list}]]) diff --git a/src/syng_im/participants/views/remove.cljs b/src/syng_im/participants/views/remove.cljs index 40ff3528f7..32cbd1882e 100644 --- a/src/syng_im/participants/views/remove.cljs +++ b/src/syng_im/participants/views/remove.cljs @@ -1,4 +1,5 @@ (ns syng-im.participants.views.remove + (:require-macros [syng-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch]] [syng-im.resources :as res] [syng-im.components.react :refer [view text-input text image @@ -22,12 +23,10 @@ [row _ _] (r/as-element [participant-contact row])) -(defn remove-participants [] - (let [contacts (subscribe [:current-chat-contacts])] - (fn [] - (let [contacts-ds (to-datasource @contacts)] - [view st/participants-container - [remove-participants-toolbar] - [list-view {:dataSource contacts-ds - :renderRow remove-participants-row - :style st/participants-list}]])))) +(defview remove-participants [] + [contacts [:current-chat-contacts]] + [view st/participants-container + [remove-participants-toolbar] + [list-view {:dataSource (to-datasource contacts) + :renderRow remove-participants-row + :style st/participants-list}]]) diff --git a/src/syng_im/profile/screen.cljs b/src/syng_im/profile/screen.cljs index 9d075c4999..00f36886ed 100644 --- a/src/syng_im/profile/screen.cljs +++ b/src/syng_im/profile/screen.cljs @@ -32,7 +32,7 @@ (defn message-user [identity] (when identity - (dispatch [:show-chat identity :push]))) + (dispatch [:navigate-to :chat identity]))) (defview profile [] [{:keys [name whisper-identity phone-number]} [:contact]] diff --git a/src/syng_im/subs.cljs b/src/syng_im/subs.cljs index 055e3e8760..6964ed715a 100644 --- a/src/syng_im/subs.cljs +++ b/src/syng_im/subs.cljs @@ -10,3 +10,7 @@ (register-sub :get (fn [db [_ k]] (reaction (k @db)))) + +(register-sub :get-in + (fn [db [_ path]] + (reaction (get-in @db path)))) diff --git a/src/syng_im/utils/subs.cljs b/src/syng_im/utils/subs.cljs new file mode 100644 index 0000000000..1ea1b7d0ee --- /dev/null +++ b/src/syng_im/utils/subs.cljs @@ -0,0 +1,10 @@ +(ns syng-im.utils.subs + (:require-macros [reagent.ratom :refer [reaction]])) + +(defn contains-sub + "Creates subscrition that cheks if collection (map or set) contains element" + [collection] + (fn [db [_ element]] + (-> (collection @db) + (contains? element) + (reaction)))) From 97b4ba8653652a616219f7a810ef464fa47d397e Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Fri, 20 May 2016 19:58:07 +0300 Subject: [PATCH 11/18] add/remove participants Former-commit-id: cd45d3420e74a49312468eb0c7822487492c257f --- src/syng_im/chat/screen.cljs | 8 +++---- src/syng_im/group_settings/handlers.cljs | 3 +-- src/syng_im/group_settings/screen.cljs | 2 +- src/syng_im/handlers.cljs | 5 ++-- src/syng_im/navigation/handlers.cljs | 15 ------------ src/syng_im/new_group/views/contact.cljs | 1 - src/syng_im/participants/handlers.cljs | 23 ++++++++++++++++++ src/syng_im/participants/subs.cljs | 8 +++++-- src/syng_im/participants/views/contact.cljs | 26 ++++++++++++--------- src/syng_im/subs.cljs | 3 ++- 10 files changed, 55 insertions(+), 39 deletions(-) create mode 100644 src/syng_im/participants/handlers.cljs diff --git a/src/syng_im/chat/screen.cljs b/src/syng_im/chat/screen.cljs index dd355b4223..1541c7b5f7 100644 --- a/src/syng_im/chat/screen.cljs +++ b/src/syng_im/chat/screen.cljs @@ -67,8 +67,8 @@ (defn on-action-selected [position] (case position - 0 (dispatch [:show-add-participants]) - 1 (dispatch [:show-remove-participants]) + 0 (dispatch [:navigate-to :add-participants]) + 1 (dispatch [:navigate-to :remove-participants]) 2 (dispatch [:leave-group-chat]))) (defn overlay [{:keys [on-click-outside]} items] @@ -119,13 +119,13 @@ :icon :menu_group :icon-style {:width 25 :height 19} - :handler #(dispatch [:show-add-participants])} + :handler #(dispatch [:navigate-to :add-participants])} {:title "Remove Contact from chat" :subtitle "Alex, John" :icon :search_gray_copy :icon-style {:width 17 :height 17} - :handler #(dispatch [:show-remove-participants])} + :handler #(dispatch [:navigate-to :remove-participants])} {:title "Leave Chat" :icon :muted :icon-style {:width 18 diff --git a/src/syng_im/group_settings/handlers.cljs b/src/syng_im/group_settings/handlers.cljs index 58dbda4067..71247222ec 100644 --- a/src/syng_im/group_settings/handlers.cljs +++ b/src/syng_im/group_settings/handlers.cljs @@ -1,8 +1,7 @@ (ns syng-im.group-settings.handlers (:require [re-frame.core :refer [register-handler debug dispatch after]] [syng-im.persistence.realm :as r] - [syng-im.models.messages :refer [clear-history]] - [clojure.string :as s])) + [syng-im.models.messages :refer [clear-history]])) (defn save-chat-property! [db-name property-name] diff --git a/src/syng_im/group_settings/screen.cljs b/src/syng_im/group_settings/screen.cljs index c74c74c020..3debc05c29 100644 --- a/src/syng_im/group_settings/screen.cljs +++ b/src/syng_im/group_settings/screen.cljs @@ -168,7 +168,7 @@ [scroll-view st/body [chat-name] [text {:style st/members-text} "Members"] - [touchable-highlight {:on-press #(dispatch [:show-add-participants])} + [touchable-highlight {:on-press #(dispatch [:navigate-to :add-participants])} [view st/add-members-container [icon :add-gray st/add-members-icon] [text {:style st/add-members-text} diff --git a/src/syng_im/handlers.cljs b/src/syng_im/handlers.cljs index 3123cf44b6..327e336144 100644 --- a/src/syng_im/handlers.cljs +++ b/src/syng_im/handlers.cljs @@ -38,9 +38,10 @@ syng-im.chat.handlers [syng-im.group-settings.handlers :refer [delete-chat]] syng-im.navigation.handlers - syng-im.discovery.handlers syng-im.contacts.handlers - syng-im.new-group.handlers)) + syng-im.discovery.handlers + syng-im.new-group.handlers + syng-im.participants.handlers)) ;; -- Middleware ------------------------------------------------------------ ;; diff --git a/src/syng_im/navigation/handlers.cljs b/src/syng_im/navigation/handlers.cljs index 6166d13ec6..f385485298 100644 --- a/src/syng_im/navigation/handlers.cljs +++ b/src/syng_im/navigation/handlers.cljs @@ -51,21 +51,6 @@ (fn [db _] (push-view db :contact-list))) -(defn clear-new-participants [db] - (assoc db :new-participants #{})) - -(register-handler :show-remove-participants - (fn [db _] - (-> db - (push-view :remove-participants) - clear-new-participants))) - -(register-handler :show-add-participants - (fn [db _] - (-> db - (push-view :add-participants) - clear-new-participants))) - (defn show-profile [db [_ identity]] (-> db diff --git a/src/syng_im/new_group/views/contact.cljs b/src/syng_im/new_group/views/contact.cljs index 6701e9fafc..e861bf02ba 100644 --- a/src/syng_im/new_group/views/contact.cljs +++ b/src/syng_im/new_group/views/contact.cljs @@ -8,7 +8,6 @@ (defn on-toggle [whisper-identity] (fn [checked?] - (println checked?) (let [action (if checked? :select-contact :deselect-contact)] (dispatch [action whisper-identity])))) diff --git a/src/syng_im/participants/handlers.cljs b/src/syng_im/participants/handlers.cljs new file mode 100644 index 0000000000..a2b71cf64d --- /dev/null +++ b/src/syng_im/participants/handlers.cljs @@ -0,0 +1,23 @@ +(ns syng-im.participants.handlers + (:require [syng-im.navigation.handlers :as nav] + [re-frame.core :refer [register-handler debug]])) + +(defmethod nav/preload-data! :add-participants + [db _] + (assoc db :new-participants #{})) + +(defmethod nav/preload-data! :remove-participants + [db _] + (assoc db :new-participants #{})) + +(defn deselect-participant + [db [_ id]] + (update db :new-participants disj id)) + +(register-handler :deselect-participant deselect-participant) + +(defn select-participant + [db [_ id]] + (update db :new-participants conj id)) + +(register-handler :select-participant (debug select-participant)) diff --git a/src/syng_im/participants/subs.cljs b/src/syng_im/participants/subs.cljs index 810a9ff3f6..c6e53a8af1 100644 --- a/src/syng_im/participants/subs.cljs +++ b/src/syng_im/participants/subs.cljs @@ -1,3 +1,7 @@ -(ns syng-im.participants.subs) +(ns syng-im.participants.subs + (:require-macros [reagent.ratom :refer [reaction]]) + (:require [re-frame.core :refer [register-sub]] + [syng-im.utils.subs :as u])) -() +(register-sub :is-participant-selected? + (u/contains-sub :new-participants)) diff --git a/src/syng_im/participants/views/contact.cljs b/src/syng_im/participants/views/contact.cljs index f193f24deb..4adbf51ba3 100644 --- a/src/syng_im/participants/views/contact.cljs +++ b/src/syng_im/participants/views/contact.cljs @@ -1,4 +1,5 @@ (ns syng-im.participants.views.contact + (:require-macros [syng-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] [syng-im.components.react :refer [view]] [syng-im.contacts.views.contact-inner :refer [contact-inner-view]] @@ -6,14 +7,17 @@ [reagent.core :as r] [syng-im.participants.styles :as st])) -(defn participant-contact [{:keys [whisper-identity] :as contact}] - ;; todo must be moved to handlers - (let [checked (r/atom false)] - (fn [{:keys [whisper-identity] :as contact}] - [view st/participant-container - [item-checkbox {:onToggle (fn [checked?] - (reset! checked checked?) - (dispatch [:select-new-participant whisper-identity checked?])) - :checked @checked - :size 30}] - [contact-inner-view contact]]))) +;; todo duplication +(defn on-toggle [whisper-identity] + (fn [checked?] + (let [action (if checked? :select-participant :deselect-participant)] + (dispatch [action whisper-identity])))) + +(defview participant-contact + [{:keys [whisper-identity] :as contact}] + [checked [:is-participant-selected? whisper-identity]] + [view st/participant-container + [item-checkbox {:onToggle (on-toggle whisper-identity) + :checked checked + :size 30}] + [contact-inner-view contact]]) diff --git a/src/syng_im/subs.cljs b/src/syng_im/subs.cljs index 6964ed715a..b2cf4af3bc 100644 --- a/src/syng_im/subs.cljs +++ b/src/syng_im/subs.cljs @@ -5,7 +5,8 @@ syng-im.group-settings.subs syng-im.discovery.subs syng-im.contacts.subs - syng-im.new-group.subs)) + syng-im.new-group.subs + syng-im.participants.subs)) (register-sub :get (fn [db [_ k]] From c086162f6810d8820307ed58d88ebbfda1205e1c Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Sat, 21 May 2016 15:23:24 +0300 Subject: [PATCH 12/18] leave group/ clear history/ add-remove participants Former-commit-id: 01d1ccdab893664cfdf0005b877771c53b107aa7 --- src/syng_im/chat/handlers.cljs | 45 +++- src/syng_im/db.cljs | 2 +- src/syng_im/group_settings/handlers.cljs | 112 ++++++++-- src/syng_im/group_settings/screen.cljs | 39 ++-- src/syng_im/group_settings/subs.cljs | 4 +- src/syng_im/group_settings/views/member.cljs | 2 +- src/syng_im/handlers.cljs | 217 +------------------ src/syng_im/models/messages.cljs | 7 - src/syng_im/navigation.cljs | 17 -- src/syng_im/navigation/handlers.cljs | 5 +- src/syng_im/participants/handlers.cljs | 8 +- src/syng_im/participants/subs.cljs | 2 +- src/syng_im/participants/views/add.cljs | 9 +- src/syng_im/participants/views/remove.cljs | 9 +- src/syng_im/protocol/handlers.cljs | 115 ++++++++++ 15 files changed, 302 insertions(+), 291 deletions(-) delete mode 100644 src/syng_im/navigation.cljs create mode 100644 src/syng_im/protocol/handlers.cljs diff --git a/src/syng_im/chat/handlers.cljs b/src/syng_im/chat/handlers.cljs index 73f2a2ece6..e6371a55d5 100644 --- a/src/syng_im/chat/handlers.cljs +++ b/src/syng_im/chat/handlers.cljs @@ -11,7 +11,8 @@ [syng-im.chat.sign-up :as sign-up-service] [syng-im.models.chats :as chats] [syng-im.navigation.handlers :as nav] - [syng-im.utils.handlers :as u])) + [syng-im.utils.handlers :as u] + [syng-im.persistence.realm :as r])) (register-handler :set-show-actions (fn [db [_ show-actions]] @@ -325,3 +326,45 @@ (register-handler :switch-command-suggestions (fn [db [_]] (suggestions/switch-command-suggestions db))) + +(defn remove-chat + [{:keys [current-chat-id] :as db} _] + (update db :chats dissoc current-chat-id)) + +(defn notify-about-leaving! + [{:keys [current-chat-id]} _] + (api/leave-group-chat current-chat-id)) + +; todo do we really need this message? +(defn leaving-message! + [{:keys [current-chat-id]} _] + (messages/save-message + current-chat-id + {:from "system" + :msg-id (random/id) + :content "You left this chat" + :content-type text-content-type})) + +(defn delete-messages! + [{:keys [current-chat-id]} _] + (r/write + (fn [] + (r/delete (r/get-by-field :msgs :chat-id current-chat-id))))) + +(defn delete-chat! + [{:keys [current-chat-id]} _] + (r/write + (fn [] + (-> (r/get-by-field :chats :chat-id current-chat-id) + (r/single) + (r/delete))))) + +(register-handler :leave-group-chat + ;; todo oreder of operations tbd + (after (fn [_ _] (dispatch [:navigation-replace :chat-list]))) + (-> remove-chat + ;; todo uncomment + ;((after notify-about-leaving!)) + ;((after leaving-message!)) + ((after delete-messages!)) + ((after delete-chat!)))) diff --git a/src/syng_im/db.cljs b/src/syng_im/db.cljs index fa814e08a2..edab7d93b6 100644 --- a/src/syng_im/db.cljs +++ b/src/syng_im/db.cljs @@ -18,7 +18,7 @@ :chats {} :chats-updated-signal 0 :show-actions false - :new-participants #{} + :selected-participants #{} :signed-up true :view-id default-view :navigation-stack (list default-view) diff --git a/src/syng_im/group_settings/handlers.cljs b/src/syng_im/group_settings/handlers.cljs index 71247222ec..d2d64d62d6 100644 --- a/src/syng_im/group_settings/handlers.cljs +++ b/src/syng_im/group_settings/handlers.cljs @@ -1,7 +1,20 @@ (ns syng-im.group-settings.handlers - (:require [re-frame.core :refer [register-handler debug dispatch after]] + (:require [re-frame.core :refer [register-handler debug dispatch after + enrich]] [syng-im.persistence.realm :as r] - [syng-im.models.messages :refer [clear-history]])) + [syng-im.chat.handlers :refer [delete-messages!]] + [syng-im.protocol.api :as api] + [syng-im.utils.random :as random] + [syng-im.models.contacts :as contacts] + [syng-im.models.messages :as messages] + [syng-im.models.chats :as chats] + [syng-im.constants :refer [text-content-type]] + [syng-im.utils.handlers :as u] + [syng-im.navigation.handlers :as nav])) + +(defmethod nav/preload-data! :group-settings + [db _] + (assoc db :selected-participants #{})) (defn save-chat-property! [db-name property-name] @@ -18,15 +31,6 @@ (let [property (db-name db)] (assoc-in db [:chats current-chat-id property-name] property)))) -(defn delete-chat [chat-id] - (r/write - (fn [] - (-> (r/get-by-field :chats :chat-id chat-id) - (r/single) - (r/delete)))) - ;; TODO temp. Update chat in db atom - (dispatch [:initialize-chats])) - (defn prepare-chat-settings [{:keys [current-chat-id] :as db} _] (let [{:keys [name color]} (-> db @@ -49,10 +53,92 @@ (after (save-chat-property! :new-chat-color :color)) (update-chat-property :new-chat-color :color)) +(defn clear-messages + [{:keys [current-chat-id] :as db} _] + (assoc-in db [:chats current-chat-id :messages] '())) + (register-handler :clear-history - (fn [db _] - (clear-history (:current-chat-id db)))) + (after delete-messages!) + clear-messages) (register-handler :group-settings (fn [db [_ k v]] (assoc-in db [:group-settings k] v))) + +(defn remove-identities [collection identities] + (remove #(identities (:identity %)) collection)) + +(defn remove-members + [{:keys [current-chat-id selected-participants] :as db} _] + (update-in db [:chats current-chat-id :contacts] + remove-identities selected-participants)) + +(defn remove-members-from-realm! + [{:keys [current-chat-id selected-participants] :as db} _] + (let [chat (get-in db [:chats current-chat-id])] + (r/write + (fn [] + (r/create + :chats + (update chat :contacts remove-identities selected-participants) + true))))) + +(defn notify-about-removing! + [{:keys [current-chat-id selected-participants]} _] + (doseq [participant selected-participants] + (api/group-remove-participant current-chat-id participant))) + +(defn system-message [msg-id content] + {:from "system" + :msg-id msg-id + :content content + :content-type text-content-type}) + +(defn removed-participant-msg [chat-id identity] + (let [contact-name (:name (contacts/contact-by-identity identity))] + (->> (str "You've removed " (or contact-name identity)) + (system-message (random/id)) + (messages/save-message chat-id)))) + +(defn create-removing-messages! + [{:keys [current-chat-id selected-participants]} _] + (doseq [participant selected-participants] + (removed-participant-msg current-chat-id participant))) + +(defn deselect-members [db _] + (assoc db :selected-participants #{})) + +(register-handler :remove-participants + ;; todo check if user have rights to add/remove participants + ;; todo order of operations tbd + (-> remove-members + ;; todo shouldn't this be done only after receiving of the "ack message" + ;; about the api call that removes participants from the group? + ((after remove-members-from-realm!)) + ;; todo uncomment + ;((after notify-about-removing!)) + ((after create-removing-messages!)) + ((enrich deselect-members)) + debug)) + +(defn add-memebers + [{:keys [current-chat-id selected-participants] :as db} _] + (let [new-identities (map #(hash-map :identity %) selected-participants)] + (update db [:chats current-chat-id :contacts] concat new-identities))) + +(defn add-members-to-realm! + [{:keys [current-chat-id selected-participants]} _] + (chats/chat-add-participants current-chat-id selected-participants)) + +(defn notify-about-new-members! + [{:keys [current-chat-id selected-participants]} _] + (doseq [identity selected-participants] + (api/group-add-participant current-chat-id identity))) + +(register-handler :add-new-participants + ;; todo order of operations tbd + (-> add-memebers + ((after add-members-to-realm!)) + ;; todo uncomment + ;((after notify-about-new-members!)) + ((enrich deselect-members)))) diff --git a/src/syng_im/group_settings/screen.cljs b/src/syng_im/group_settings/screen.cljs index 3debc05c29..d89022c7b4 100644 --- a/src/syng_im/group_settings/screen.cljs +++ b/src/syng_im/group_settings/screen.cljs @@ -16,25 +16,25 @@ [syng-im.group-settings.views.member :refer [member-view]] [clojure.string :as s])) -(defn remove-member [{:keys [whisper-identity]}] - (dispatch [:chat-remove-member whisper-identity])) +(defn remove-member [] + (dispatch [:remove-participants])) (defn close-member-menu [] - (dispatch [:set :group-settings-selected-member nil])) + (dispatch [:set :selected-participants #{}])) (defview member-menu [] - [member [:group-settings-selected-member]] - [modal {:animated false - :transparent false - :onRequestClose close-member-menu} - [touchable-highlight {:style st/modal-container - :on-press close-member-menu} - [view st/modal-inner-container - [text {:style st/modal-member-name} - (:name member)] - [touchable-highlight {:on-press #(remove-member member)} - [text {:style st/modal-remove-text} - "Remove"]]]]]) + [{:keys [name] :as participant} [:selected-participant]] + (when participant + [modal {:animated false + :transparent false + :onRequestClose close-member-menu} + [touchable-highlight {:style st/modal-container + :on-press close-member-menu} + [view st/modal-inner-container + [text {:style st/modal-member-name} name] + [touchable-highlight {:on-press remove-member} + [text {:style st/modal-remove-text} + "Remove"]]]]])) (defview chat-members [] [members [:current-chat-contacts]] @@ -42,9 +42,6 @@ (for [member members] ^{:key member} [member-view member])]) -(defn show-chat-name-edit [] - (dispatch [:navigate-to :chat-name-edit])) - (defn setting-view [{:keys [icon-style custom-icon handler title subtitle] icon-name :icon}] [touchable-highlight {:on-press handler} @@ -161,8 +158,7 @@ [text {:style st/chat-name-btn-edit-text} "Edit"]])]]) (defview group-settings [] - [selected-member [:group-settings-selected-member] - show-color-picker [:group-settings :show-color-picker]] + [show-color-picker [:group-settings :show-color-picker]] [view st/group-settings [new-group-toolbar] [scroll-view st/body @@ -179,5 +175,4 @@ [settings-view]] (when show-color-picker [chat-color-picker]) - (when selected-member - [member-menu])]) + [member-menu]]) diff --git a/src/syng_im/group_settings/subs.cljs b/src/syng_im/group_settings/subs.cljs index 844a7088af..816c5b0954 100644 --- a/src/syng_im/group_settings/subs.cljs +++ b/src/syng_im/group_settings/subs.cljs @@ -2,10 +2,10 @@ (:require-macros [reagent.ratom :refer [reaction]]) (:require [re-frame.core :refer [register-sub]])) -(register-sub :group-settings-selected-member +(register-sub :selected-participant (fn [db [_]] (reaction - (let [identity (get @db :group-settings-selected-member)] + (let [identity (first (get @db :selected-participants))] (get-in @db [:contacts identity]))))) (register-sub :group-settings diff --git a/src/syng_im/group_settings/views/member.cljs b/src/syng_im/group_settings/views/member.cljs index 593a8c7eab..79f0bc6e4c 100644 --- a/src/syng_im/group_settings/views/member.cljs +++ b/src/syng_im/group_settings/views/member.cljs @@ -38,6 +38,6 @@ [text {:style st/role-text} role])] [touchable-highlight - {:on-press #(dispatch [:set :group-settings-selected-member whisper-identity])} + {:on-press #(dispatch [:set :selected-participants #{whisper-identity}])} [view st/more-btn [icon :more-vertical st/more-btn-icon]]]]) diff --git a/src/syng_im/handlers.cljs b/src/syng_im/handlers.cljs index 327e336144..da547db56c 100644 --- a/src/syng_im/handlers.cljs +++ b/src/syng_im/handlers.cljs @@ -1,47 +1,23 @@ (ns syng-im.handlers (:require - [re-frame.core :refer [register-handler after dispatch debug enrich]] + [re-frame.core :refer [register-handler after dispatch debug]] [schema.core :as s :include-macros true] - [syng-im.persistence.realm :as r] [syng-im.db :refer [app-db schema]] [syng-im.persistence.simple-kv-store :as kv] [syng-im.protocol.state.storage :as storage] - [syng-im.db :as db :refer [app-db schema]] - [syng-im.protocol.api :refer [init-protocol]] - [syng-im.protocol.protocol-handler :refer [make-handler]] - [syng-im.models.protocol :refer [update-identity - set-initialized]] - [syng-im.models.contacts :as contacts] - [syng-im.models.messages :refer [save-message - update-message! - clear-history]] [syng-im.models.commands :refer [set-commands]] - [syng-im.handlers.server :as server] [syng-im.chat.suggestions :refer [load-commands]] - [syng-im.models.chats :refer [chat-exists? - create-chat - chat-add-participants - chat-remove-participants - set-chat-active - re-join-group-chat - chat-by-id2]] [syng-im.utils.logging :as log] - [syng-im.protocol.api :as api] - [syng-im.constants :refer [text-content-type - content-type-command]] - [syng-im.navigation :refer [nav-push - nav-replace - nav-pop]] [syng-im.utils.crypt :refer [gen-random-bytes]] - [syng-im.utils.random :as random] [syng-im.utils.handlers :as u] syng-im.chat.handlers - [syng-im.group-settings.handlers :refer [delete-chat]] + syng-im.group-settings.handlers syng-im.navigation.handlers syng-im.contacts.handlers syng-im.discovery.handlers syng-im.new-group.handlers - syng-im.participants.handlers)) + syng-im.participants.handlers + syng-im.protocol.handlers)) ;; -- Middleware ------------------------------------------------------------ ;; @@ -106,193 +82,8 @@ (log/debug action commands) (set-commands db commands))) -;; -- Protocol -------------------------------------------------------------- - -(register-handler :initialize-protocol - (u/side-effect! - (fn [db [_]] - (init-protocol (make-handler db))))) - -(register-handler :protocol-initialized - (fn [db [_ identity]] - (-> db - (update-identity identity) - (set-initialized true)))) - -(defn system-message [msg-id content] - {:from "system" - :msg-id msg-id - :content content - :content-type text-content-type}) - -(defn joined-chat-msg [chat-id from msg-id] - (let [contact-name (:name (contacts/contact-by-identity from))] - (save-message chat-id {:from "system" - :msg-id (str msg-id "_" from) - :content (str (or contact-name from) " received chat invitation") - :content-type text-content-type}))) - -(defn participant-invited-to-group-msg [chat-id identity from msg-id] - (let [inviter-name (:name (contacts/contact-by-identity from)) - invitee-name (if (= identity (api/my-identity)) - "You" - (:name (contacts/contact-by-identity identity)))] - (save-message chat-id {:from "system" - :msg-id msg-id - :content (str (or inviter-name from) " invited " (or invitee-name identity)) - :content-type text-content-type}))) - -(defn participant-removed-from-group-msg [chat-id identity from msg-id] - (let [remover-name (:name (contacts/contact-by-identity from)) - removed-name (:name (contacts/contact-by-identity identity))] - (->> (str (or remover-name from) " removed " (or removed-name identity)) - (system-message msg-id) - (save-message chat-id)))) - -(defn you-removed-from-group-msg [chat-id from msg-id] - (let [remover-name (:name (contacts/contact-by-identity from))] - (->> (str (or remover-name from) " removed you from group chat") - (system-message msg-id) - (save-message chat-id)))) - -(defn participant-left-group-msg [chat-id from msg-id] - (let [left-name (:name (contacts/contact-by-identity from))] - (->> (str (or left-name from) " left") - (system-message msg-id) - (save-message chat-id)))) - -(defn removed-participant-msg [chat-id identity] - (let [contact-name (:name (contacts/contact-by-identity identity))] - (->> (str "You've removed " (or contact-name identity)) - (system-message (random/id)) - (save-message chat-id)))) - -(defn left-chat-msg [chat-id] - (save-message chat-id {:from "system" - :msg-id (random/id) - :content "You left this chat" - :content-type text-content-type})) - -(register-handler :group-chat-invite-acked - (u/side-effect! - (fn [_ [action from group-id ack-msg-id]] - (log/debug action from group-id ack-msg-id) - (joined-chat-msg group-id from ack-msg-id)))) - -(register-handler :participant-removed-from-group - (u/side-effect! - (fn [_ [action from group-id identity msg-id]] - (log/debug action msg-id from group-id identity) - (chat-remove-participants group-id [identity]) - (participant-removed-from-group-msg group-id identity from msg-id)))) - -(register-handler :you-removed-from-group - (u/side-effect! - (fn [_ [action from group-id msg-id]] - (log/debug action msg-id from group-id) - (you-removed-from-group-msg group-id from msg-id) - (set-chat-active group-id false)))) - -(register-handler :participant-left-group - (u/side-effect! - (fn [_ [action from group-id msg-id]] - (log/debug action msg-id from group-id) - (when-not (= (api/my-identity) from) - (participant-left-group-msg group-id from msg-id))))) - -(register-handler :participant-invited-to-group - (u/side-effect! - (fn [_ [action from group-id identity msg-id]] - (log/debug action msg-id from group-id identity) - (participant-invited-to-group-msg group-id identity from msg-id)))) - -(register-handler :acked-msg - (u/side-effect! - (fn [_ [action from msg-id]] - (log/debug action from msg-id) - (update-message! {:msg-id msg-id - :delivery-status :delivered})))) - -(register-handler :msg-delivery-failed - (u/side-effect! - (fn [_ [action msg-id]] - (log/debug action msg-id) - (update-message! {:msg-id msg-id - :delivery-status :failed})))) - -(register-handler :leave-group-chat - (u/side-effect! - (fn [db [action]] - (log/debug action) - (let [chat-id (:current-chat-id db)] - (api/leave-group-chat chat-id) - (set-chat-active chat-id false) - (left-chat-msg chat-id) - (delete-chat chat-id) - (dispatch [:navigate-back]))))) - ;; -- User data -------------------------------------------------------------- (register-handler :load-user-phone-number (fn [db [_]] ;; todo fetch phone number from db (assoc db :user-phone-number "123"))) - -;; -- Chats -------------------------------------------------------------- -(defn update-new-participants-selection [db identity add?] - (update db :new-participants (fn [new-participants] - (if add? - (conj new-participants identity) - (disj new-participants identity))))) - -(register-handler :select-new-participant - (fn [db [action identity add?]] - (log/debug action identity add?) - (update-new-participants-selection db identity add?))) - -(register-handler :remove-selected-participants - (fn [db [action]] - (log/debug action) - (let [identities (vec (:new-participants db)) - chat-id (:current-chat-id db)] - (chat-remove-participants chat-id identities) - (dispatch [:navigate-back]) - (doseq [ident identities] - (api/group-remove-participant chat-id ident) - (removed-participant-msg chat-id ident))))) - -(register-handler :add-new-participants - (fn [db [action navigator]] - (log/debug action) - (let [identities (vec (:new-participants db)) - chat-id (:current-chat-id db)] - (chat-add-participants chat-id identities) - (dispatch [:navigate-back]) - (doseq [ident identities] - (api/group-add-participant chat-id ident)) - db))) - -(defn chat-remove-member [db] - (let [chat (get-in db [:chats (:current-chat-id db)]) - identity (:group-settings-selected-member db)] - (r/write - (fn [] - (r/create :chats - (update chat :contacts - (fn [members] - (filter #(not= (:identity %) identity) members))) - true))) - ;; TODO temp. Update chat in db atom - (dispatch [:initialize-chats]) - db)) - - -(register-handler :chat-remove-member - (fn [db [action]] - (let [chat-id (:current-chat-id db) - identity (:group-settings-selected-member db) - db (chat-remove-member db)] - (dispatch [:set :group-settings-selected-member nil]) - ;; TODO fix and uncomment - (api/group-remove-participant chat-id identity) - (removed-participant-msg chat-id identity) - db))) diff --git a/src/syng_im/models/messages.cljs b/src/syng_im/models/messages.cljs index 2706cad94a..eeca56ce29 100644 --- a/src/syng_im/models/messages.cljs +++ b/src/syng_im/models/messages.cljs @@ -62,10 +62,3 @@ (fn [] (when (r/exists? :msgs :msg-id msg-id) (r/create :msgs msg true))))) - -(defn clear-history [chat-id] - (r/write - (fn [] - (r/delete (r/get-by-field :msgs :chat-id chat-id)))) - ;; TODO temp. Update chat in db atom - (dispatch [:initialize-chats])) diff --git a/src/syng_im/navigation.cljs b/src/syng_im/navigation.cljs deleted file mode 100644 index 9c95aa81b2..0000000000 --- a/src/syng_im/navigation.cljs +++ /dev/null @@ -1,17 +0,0 @@ -(ns syng-im.navigation) - -(def ^{:dynamic true :private true} *nav-render* - "Flag to suppress navigator re-renders from outside om when pushing/popping." - true) - -(defn nav-pop [nav] - (binding [*nav-render* true] - (.pop nav))) - -(defn nav-push [nav route] - (binding [*nav-render* true] - (.push nav (clj->js route)))) - -(defn nav-replace [nav route] - (binding [*nav-render* true] - (.replace nav (clj->js route)))) diff --git a/src/syng_im/navigation/handlers.cljs b/src/syng_im/navigation/handlers.cljs index f385485298..17f742254d 100644 --- a/src/syng_im/navigation/handlers.cljs +++ b/src/syng_im/navigation/handlers.cljs @@ -18,7 +18,9 @@ (update :navigation-stack replace-top-element view-id) (assoc :view-id view-id))) -(defmulti preload-data! (fn [_ [_ view-id]] view-id)) +(defmulti preload-data! + (fn [db [_ view-id]] (or view-id (:view-id db)))) + (defmethod preload-data! :default [db _] db) (register-handler :navigate-to @@ -32,6 +34,7 @@ (replace-view db view-id))) (register-handler :navigate-back + (enrich preload-data!) (fn [{:keys [navigation-stack] :as db} _] (if (>= 1 (count navigation-stack)) db diff --git a/src/syng_im/participants/handlers.cljs b/src/syng_im/participants/handlers.cljs index a2b71cf64d..06eb073190 100644 --- a/src/syng_im/participants/handlers.cljs +++ b/src/syng_im/participants/handlers.cljs @@ -4,20 +4,20 @@ (defmethod nav/preload-data! :add-participants [db _] - (assoc db :new-participants #{})) + (assoc db :selected-participants #{})) (defmethod nav/preload-data! :remove-participants [db _] - (assoc db :new-participants #{})) + (assoc db :selected-participants #{})) (defn deselect-participant [db [_ id]] - (update db :new-participants disj id)) + (update db :selected-participants disj id)) (register-handler :deselect-participant deselect-participant) (defn select-participant [db [_ id]] - (update db :new-participants conj id)) + (update db :selected-participants conj id)) (register-handler :select-participant (debug select-participant)) diff --git a/src/syng_im/participants/subs.cljs b/src/syng_im/participants/subs.cljs index c6e53a8af1..3d4a60bfa3 100644 --- a/src/syng_im/participants/subs.cljs +++ b/src/syng_im/participants/subs.cljs @@ -4,4 +4,4 @@ [syng-im.utils.subs :as u])) (register-sub :is-participant-selected? - (u/contains-sub :new-participants)) + (u/contains-sub :selected-participants)) diff --git a/src/syng_im/participants/views/add.cljs b/src/syng_im/participants/views/add.cljs index 826579fcd1..e336cbc4d2 100644 --- a/src/syng_im/participants/views/add.cljs +++ b/src/syng_im/participants/views/add.cljs @@ -11,10 +11,11 @@ (defn new-participants-toolbar [] [toolbar - {:title "Add Participants" - :action {:image {:source res/v ;; {:uri "icon_search"} - :style st/new-participant-image} - :handler #(dispatch [:add-new-participants])}}]) + {:title "Add Participants" + :action {:image {:source res/v ;; {:uri "icon_search"} + :style st/new-participant-image} + :handler #(do (dispatch [:add-new-participants]) + (dispatch [:navigate-back]))}}]) (defn new-participants-row [row _ _] diff --git a/src/syng_im/participants/views/remove.cljs b/src/syng_im/participants/views/remove.cljs index 32cbd1882e..d2ebd11cfd 100644 --- a/src/syng_im/participants/views/remove.cljs +++ b/src/syng_im/participants/views/remove.cljs @@ -14,10 +14,11 @@ (defn remove-participants-toolbar [] [toolbar - {:title "Remove Participants" - :action {:handler #(dispatch [:remove-selected-participants]) - :image {:source res/trash-icon ;; {:uri "icon_search"} - :style st/remove-participants-image}}}]) + {:title "Remove Participants" + :action {:handler #(do (dispatch [:remove-participants]) + (dispatch [:navigate-back])) + :image {:source res/trash-icon ;; {:uri "icon_search"} + :style st/remove-participants-image}}}]) (defn remove-participants-row [row _ _] diff --git a/src/syng_im/protocol/handlers.cljs b/src/syng_im/protocol/handlers.cljs new file mode 100644 index 0000000000..10bb1a4d2b --- /dev/null +++ b/src/syng_im/protocol/handlers.cljs @@ -0,0 +1,115 @@ +; todo everything inside this namespace must be revievew in common with future +; changes in protocol lib +(ns syng-im.protocol.handlers + (:require [syng-im.utils.handlers :as u] + [syng-im.utils.logging :as log] + [syng-im.protocol.api :as api] + [re-frame.core :refer [register-handler dispatch debug]] + [syng-im.models.contacts :as contacts] + [syng-im.protocol.api :refer [init-protocol]] + [syng-im.protocol.protocol-handler :refer [make-handler]] + [syng-im.models.protocol :refer [update-identity + set-initialized]] + [syng-im.constants :refer [text-content-type]] + [syng-im.models.messages :as messages] + [syng-im.models.chats :as chats])) + +(register-handler :initialize-protocol + (u/side-effect! + (fn [db [_]] + (init-protocol (make-handler db))))) + +(register-handler :protocol-initialized + (fn [db [_ identity]] + (-> db + (update-identity identity) + (set-initialized true)))) + +(defn system-message [msg-id content] + {:from "system" + :msg-id msg-id + :content content + :content-type text-content-type}) + +(defn joined-chat-msg [chat-id from msg-id] + (let [contact-name (:name (contacts/contact-by-identity from))] + (messages/save-message chat-id {:from "system" + :msg-id (str msg-id "_" from) + :content (str (or contact-name from) " received chat invitation") + :content-type text-content-type}))) + +(defn participant-invited-to-group-msg [chat-id identity from msg-id] + (let [inviter-name (:name (contacts/contact-by-identity from)) + invitee-name (if (= identity (api/my-identity)) + "You" + (:name (contacts/contact-by-identity identity)))] + (messages/save-message chat-id {:from "system" + :msg-id msg-id + :content (str (or inviter-name from) " invited " (or invitee-name identity)) + :content-type text-content-type}))) + +(defn participant-removed-from-group-msg [chat-id identity from msg-id] + (let [remover-name (:name (contacts/contact-by-identity from)) + removed-name (:name (contacts/contact-by-identity identity))] + (->> (str (or remover-name from) " removed " (or removed-name identity)) + (system-message msg-id) + (messages/save-message chat-id)))) + +(defn you-removed-from-group-msg [chat-id from msg-id] + (let [remover-name (:name (contacts/contact-by-identity from))] + (->> (str (or remover-name from) " removed you from group chat") + (system-message msg-id) + (messages/save-message chat-id)))) + +(defn participant-left-group-msg [chat-id from msg-id] + (let [left-name (:name (contacts/contact-by-identity from))] + (->> (str (or left-name from) " left") + (system-message msg-id) + (messages/save-message chat-id)))) + +(register-handler :group-chat-invite-acked + (u/side-effect! + (fn [_ [action from group-id ack-msg-id]] + (log/debug action from group-id ack-msg-id) + (joined-chat-msg group-id from ack-msg-id)))) + +(register-handler :participant-removed-from-group + (u/side-effect! + (fn [_ [action from group-id identity msg-id]] + (log/debug action msg-id from group-id identity) + (chats/chat-remove-participants group-id [identity]) + (participant-removed-from-group-msg group-id identity from msg-id)))) + +(register-handler :you-removed-from-group + (u/side-effect! + (fn [_ [action from group-id msg-id]] + (log/debug action msg-id from group-id) + (you-removed-from-group-msg group-id from msg-id) + (chats/set-chat-active group-id false)))) + +(register-handler :participant-left-group + (u/side-effect! + (fn [_ [action from group-id msg-id]] + (log/debug action msg-id from group-id) + (when-not (= (api/my-identity) from) + (participant-left-group-msg group-id from msg-id))))) + +(register-handler :participant-invited-to-group + (u/side-effect! + (fn [_ [action from group-id identity msg-id]] + (log/debug action msg-id from group-id identity) + (participant-invited-to-group-msg group-id identity from msg-id)))) + +(register-handler :acked-msg + (u/side-effect! + (fn [_ [action from msg-id]] + (log/debug action from msg-id) + (messages/update-message! {:msg-id msg-id + :delivery-status :delivered})))) + +(register-handler :msg-delivery-failed + (u/side-effect! + (fn [_ [action msg-id]] + (log/debug action msg-id) + (messages/update-message! {:msg-id msg-id + :delivery-status :failed})))) From ec1439943d755229339fba004e2c0695b32f7070 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Sat, 21 May 2016 16:32:04 +0300 Subject: [PATCH 13/18] fix loading of chat's messages Former-commit-id: 8bda73920150ec96d177635479a718db122157ca --- src/status_im/chat/handlers.cljs | 12 +++++++----- src/status_im/group_settings/subs.cljs | 10 ++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/status_im/chat/handlers.cljs b/src/status_im/chat/handlers.cljs index e7e7ed1621..29ccd437a1 100644 --- a/src/status_im/chat/handlers.cljs +++ b/src/status_im/chat/handlers.cljs @@ -285,13 +285,15 @@ (defmethod nav/preload-data! :chat [{:keys [current-chat-id] :as db} [_ _ id]] - (let [messages (get-in db [:chats current-chat-id :messages])] + (let [chat-id (or id current-chat-id) + messages (get-in db [:chats chat-id :messages]) + db' (assoc db :current-chat-id chat-id)] + (println "wuuut..." chat-id messages) (if (seq messages) - (-> db - (assoc :current-chat-id (or id current-chat-id)) + db' + (-> db' load-messages! - init-chat) - db))) + init-chat)))) (defn prepare-chat [{:keys [contacts] :as db} [_ contcat-id]] diff --git a/src/status_im/group_settings/subs.cljs b/src/status_im/group_settings/subs.cljs index ee9ad34c8a..f2b6ac1db3 100644 --- a/src/status_im/group_settings/subs.cljs +++ b/src/status_im/group_settings/subs.cljs @@ -3,12 +3,10 @@ (:require [re-frame.core :refer [register-sub]])) (register-sub :selected-participant - (fn [db [_]] - (let [participants (:selected-participants @db)] - (reaction - (when (seq participants) - (let [identity (first participants)] - (get-in @db [:contacts identity]))))))) + (fn [db _] + (reaction + (let [identity (first (:selected-participants @db))] + (get-in @db [:contacts identity]))))) (register-sub :group-settings (fn [db [_ k]] From c6de5075fe4239f3563d7797505c4c2ee53060cf Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Sat, 21 May 2016 16:34:06 +0300 Subject: [PATCH 14/18] remove println Former-commit-id: 86f80dc52560402abe0956abae83ee4092f35dc7 --- src/status_im/chat/handlers.cljs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/status_im/chat/handlers.cljs b/src/status_im/chat/handlers.cljs index 29ccd437a1..3564ea8e69 100644 --- a/src/status_im/chat/handlers.cljs +++ b/src/status_im/chat/handlers.cljs @@ -288,7 +288,6 @@ (let [chat-id (or id current-chat-id) messages (get-in db [:chats chat-id :messages]) db' (assoc db :current-chat-id chat-id)] - (println "wuuut..." chat-id messages) (if (seq messages) db' (-> db' From 322622ae52aeddf5e4807504a66139a7d1f7141a Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Sun, 22 May 2016 10:22:22 +0300 Subject: [PATCH 15/18] rename main-tabs.cljs Former-commit-id: ebe61c9d9514a2baf31f49291b95f12ce60356e0 --- src/status_im/components/{main-tabs.cljs => main_tabs.cljs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/status_im/components/{main-tabs.cljs => main_tabs.cljs} (97%) diff --git a/src/status_im/components/main-tabs.cljs b/src/status_im/components/main_tabs.cljs similarity index 97% rename from src/status_im/components/main-tabs.cljs rename to src/status_im/components/main_tabs.cljs index 5b8751b39d..3464550156 100644 --- a/src/status_im/components/main-tabs.cljs +++ b/src/status_im/components/main_tabs.cljs @@ -1,4 +1,4 @@ -(ns status-im.components.main-tabs +(ns status-im.components.main_tabs (:require-macros [status-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] [status-im.components.react :refer [view From 2b70ed56f4bdf795cd8f9fe6860c84d6620052c7 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Sun, 22 May 2016 18:17:22 +0300 Subject: [PATCH 16/18] fix typo in ns Former-commit-id: 547ececac372fafe71a643b72d04dae008187ad7 --- src/status_im/components/main_tabs.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/status_im/components/main_tabs.cljs b/src/status_im/components/main_tabs.cljs index 3464550156..5b8751b39d 100644 --- a/src/status_im/components/main_tabs.cljs +++ b/src/status_im/components/main_tabs.cljs @@ -1,4 +1,4 @@ -(ns status-im.components.main_tabs +(ns status-im.components.main-tabs (:require-macros [status-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] [status-im.components.react :refer [view From 563e0d69c776ec532401295c2712b68ef29aaabb Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Sun, 22 May 2016 23:36:43 +0300 Subject: [PATCH 17/18] fix last element scroll Former-commit-id: ff0307d4ce1c9e2b03640ec08f6623ba18e79e66 --- src/status_im/chats_list/styles.cljs | 3 ++- src/status_im/contacts/styles.cljs | 3 ++- src/status_im/discovery/screen.cljs | 2 +- src/status_im/discovery/styles.cljs | 3 +++ 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/status_im/chats_list/styles.cljs b/src/status_im/chats_list/styles.cljs index 645db00014..26684a82b3 100644 --- a/src/status_im/chats_list/styles.cljs +++ b/src/status_im/chats_list/styles.cljs @@ -134,7 +134,8 @@ :backgroundColor :white}) (def list-container - {:backgroundColor :white}) + {:backgroundColor :white + :marginBottom 56}) (def create-icon {:fontSize 20 diff --git a/src/status_im/contacts/styles.cljs b/src/status_im/contacts/styles.cljs index 4cbec2cdff..0629575db3 100644 --- a/src/status_im/contacts/styles.cljs +++ b/src/status_im/contacts/styles.cljs @@ -14,7 +14,8 @@ :backgroundColor :white}) (def contacts-list - {:backgroundColor :white}) + {:backgroundColor :white + :marginBottom 56}) (def contact-photo-container {:borderRadius 50}) diff --git a/src/status_im/discovery/screen.cljs b/src/status_im/discovery/screen.cljs index 00c49e1c05..ab2c80e314 100644 --- a/src/status_im/discovery/screen.cljs +++ b/src/status_im/discovery/screen.cljs @@ -44,7 +44,7 @@ :action {:image {:source {:uri :icon_search} :style st/search-icon} :handler #(toogle-search show-search)}}] - [scroll-view {:style {}} + [scroll-view st/scroll-view-container [view st/section-spacing [text {:style st/discovery-subtitle} "Popular tags"]] [popular] diff --git a/src/status_im/discovery/styles.cljs b/src/status_im/discovery/styles.cljs index 3b94fce516..beb1209498 100644 --- a/src/status_im/discovery/styles.cljs +++ b/src/status_im/discovery/styles.cljs @@ -58,6 +58,9 @@ :paddingTop 15 :paddingBottom 15}) +(def scroll-view-container + {:marginBottom 56}) + ;; discovery_popular.cljs (def carousel-page-style From 2e49994c862111b9af43f0809a8bcbb7b023ddbd Mon Sep 17 00:00:00 2001 From: Adrian Tiberius Date: Mon, 23 May 2016 13:13:06 +0300 Subject: [PATCH 18/18] small code clean Former-commit-id: 45c35733be4f1c4c09d7d563f84d62020729287a --- src/status_im/chats_list/styles.cljs | 5 ++- src/status_im/contacts/styles.cljs | 5 ++- src/status_im/discovery/styles.cljs | 67 ++++++++++++++-------------- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/status_im/chats_list/styles.cljs b/src/status_im/chats_list/styles.cljs index 26684a82b3..592a882d3e 100644 --- a/src/status_im/chats_list/styles.cljs +++ b/src/status_im/chats_list/styles.cljs @@ -6,7 +6,8 @@ online-color text1-color text2-color - new-messages-count-color]])) + new-messages-count-color]] + [status-im.components.tabs.styles :refer [tab-height]])) (def contact-photo-container {:borderRadius 50}) @@ -135,7 +136,7 @@ (def list-container {:backgroundColor :white - :marginBottom 56}) + :marginBottom tab-height}) (def create-icon {:fontSize 20 diff --git a/src/status_im/contacts/styles.cljs b/src/status_im/contacts/styles.cljs index 0629575db3..7455363d38 100644 --- a/src/status_im/contacts/styles.cljs +++ b/src/status_im/contacts/styles.cljs @@ -3,7 +3,8 @@ title-font text1-color color-white - online-color]])) + online-color]] + [status-im.components.tabs.styles :refer [tab-height]])) (def search-icon {:width 17 @@ -15,7 +16,7 @@ (def contacts-list {:backgroundColor :white - :marginBottom 56}) + :marginBottom tab-height}) (def contact-photo-container {:borderRadius 50}) diff --git a/src/status_im/discovery/styles.cljs b/src/status_im/discovery/styles.cljs index beb1209498..979cd287a0 100644 --- a/src/status_im/discovery/styles.cljs +++ b/src/status_im/discovery/styles.cljs @@ -1,14 +1,15 @@ (ns status-im.discovery.styles (:require [status-im.components.styles :refer [font - title-font - color-white - chat-background - online-color - selected-message-color - separator-color - text1-color - text2-color - toolbar-background1]])) + title-font + color-white + chat-background + online-color + selected-message-color + separator-color + text1-color + text2-color + toolbar-background1]] + [status-im.components.tabs.styles :refer [tab-height]])) ;; common @@ -39,7 +40,7 @@ (def discovery-title {:color "#000000de" - :alignSelf :center + :alignSelf :center :textAlign :center :fontFamily "sans-serif" :fontSize 16}) @@ -59,7 +60,7 @@ :paddingBottom 15}) (def scroll-view-container - {:marginBottom 56}) + {:marginBottom tab-height}) ;; discovery_popular.cljs @@ -74,12 +75,12 @@ ;; discovery_populat_list.cljs (def tag-name - {:color "#7099e6" - :fontFamily "sans-serif-medium" - :fontSize 14 - :paddingRight 5 - :paddingBottom 2 - :alignItems :center + {:color "#7099e6" + :fontFamily "sans-serif-medium" + :fontSize 14 + :paddingRight 5 + :paddingBottom 2 + :alignItems :center :justifyContent :center}) (def tag-name-container @@ -89,12 +90,12 @@ :padding 4}) (def tag-count - {:color "#838c93" - :fontFamily "sans-serif" - :fontSize 12 - :paddingRight 5 - :paddingBottom 2 - :alignItems :center + {:color "#838c93" + :fontFamily "sans-serif" + :fontSize 12 + :paddingRight 5 + :paddingBottom 2 + :alignItems :center :justifyContent :center}) (def tag-count-container @@ -105,20 +106,20 @@ :paddingRight 9}) (def popular-list-container - {:flex 1 + {:flex 1 :backgroundColor :white - :paddingLeft 10 - :paddingTop 16}) + :paddingLeft 10 + :paddingTop 16}) (def popular-list {:backgroundColor :white - :paddingTop 13}) + :paddingTop 13}) ;; discover_popular_list_item.cjls (def popular-list-item {:flexDirection :row - :paddingTop 10 + :paddingTop 10 :paddingBottom 10}) (def popular-list-item-status @@ -140,8 +141,8 @@ (def popular-list-item-avatar-container {:flex 0.2 :flexDirection "column" - :alignItems :center - :paddingTop 5}) + :alignItems :center + :paddingTop 5}) (def popular-list-item-avatar {:resizeMode "contain" @@ -153,7 +154,7 @@ (def recent-list {:backgroundColor :white - :paddingLeft 15}) + :paddingLeft 15}) ;; discovery_tag @@ -162,8 +163,8 @@ :backgroundColor "#eef2f5"}) (def tag-title-container - {:flex 1 - :alignItems "center" + {:flex 1 + :alignItems "center" :justifyContent "center"}) (def tag-title