From 1b6112a9bd07c7cab2097f539b7fc672199932af Mon Sep 17 00:00:00 2001 From: Andrey Shovkoplyas Date: Fri, 17 Mar 2017 17:37:54 +0300 Subject: [PATCH] first iteration, implemented profile screens and my profile screen android styles, moved styles to platform files implemented edit profile, refactored components refactored common components, moved platform specific styles small fix fixes for code review use defstyle macro --- .../drawable-hdpi/icon_arrow_right_blue.png | Bin 0 -> 463 bytes .../res/drawable-hdpi/icon_chats_blue.png | Bin 0 -> 792 bytes .../main/res/drawable-hdpi/icon_ok_blue.png | Bin 647 -> 788 bytes .../main/res/drawable-hdpi/icon_q_r_blue.png | Bin 0 -> 704 bytes .../drawable-mdpi/icon_arrow_right_blue.png | Bin 0 -> 356 bytes .../res/drawable-mdpi/icon_chats_blue.png | Bin 0 -> 474 bytes .../main/res/drawable-mdpi/icon_ok_blue.png | Bin 501 -> 490 bytes .../main/res/drawable-mdpi/icon_q_r_blue.png | Bin 0 -> 388 bytes .../drawable-xhdpi/icon_arrow_right_blue.png | Bin 0 -> 554 bytes .../res/drawable-xhdpi/icon_chats_blue.png | Bin 0 -> 810 bytes .../main/res/drawable-xhdpi/icon_ok_blue.png | Bin 930 -> 1091 bytes .../main/res/drawable-xhdpi/icon_q_r_blue.png | Bin 0 -> 691 bytes .../drawable-xxhdpi/icon_arrow_right_blue.png | Bin 0 -> 721 bytes .../res/drawable-xxhdpi/icon_chats_blue.png | Bin 0 -> 1217 bytes .../main/res/drawable-xxhdpi/icon_ok_blue.png | Bin 1464 -> 1546 bytes .../res/drawable-xxhdpi/icon_q_r_blue.png | Bin 0 -> 1007 bytes .../icon_arrow_right_blue.png | Bin 0 -> 916 bytes .../res/drawable-xxxhdpi/icon_chats_blue.png | Bin 0 -> 1634 bytes .../res/drawable-xxxhdpi/icon_ok_blue.png | Bin 2050 -> 2130 bytes .../res/drawable-xxxhdpi/icon_q_r_blue.png | Bin 0 -> 1356 bytes .../Contents.json | 21 + .../icon_arrow_right_blue.png | Bin 0 -> 554 bytes .../icon_chats_blue.imageset/Contents.json | 21 + .../icon_chats_blue.png | Bin 0 -> 810 bytes .../icon_ok_blue.imageset/icon_ok_blue.png | Bin 1464 -> 1091 bytes .../icon_q_r_blue.imageset/Contents.json | 21 + .../icon_q_r_blue.imageset/icon_q_r_blue.png | Bin 0 -> 691 bytes src/status_im/android/core.cljs | 7 +- src/status_im/android/platform.cljs | 34 +- src/status_im/chats_list/screen.cljs | 15 +- src/status_im/components/action_button.cljs | 7 - .../action_button/action_button.cljs | 19 + .../components/action_button/styles.cljs | 30 ++ .../components/chat_icon/screen.cljs | 23 +- .../components/chat_icon/styles.cljs | 26 +- src/status_im/components/common/common.cljs | 17 + src/status_im/components/common/styles.cljs | 28 ++ src/status_im/components/list_selection.cljs | 4 + .../components/native_action_button.cljs | 7 + src/status_im/components/styles.cljs | 1 + src/status_im/components/text_field/view.cljs | 8 +- .../components/toolbar_new/view.cljs | 6 +- src/status_im/contacts/screen.cljs | 39 +- src/status_im/contacts/styles.cljs | 31 +- .../contacts/views/contact_list.cljs | 4 +- src/status_im/ios/core.cljs | 7 +- src/status_im/ios/platform.cljs | 45 +- src/status_im/new_group/styles.cljs | 2 +- .../new_group/views/chat_group_settings.cljs | 2 +- .../new_group/views/contact_toggle_list.cljs | 4 +- src/status_im/new_group/views/group.cljs | 7 +- .../new_group/views/reorder_groups.cljs | 13 +- src/status_im/profile/edit/screen.cljs | 90 ++++ src/status_im/profile/handlers.cljs | 22 +- src/status_im/profile/screen.cljs | 394 ++++++++---------- src/status_im/profile/styles.cljs | 292 +++++++------ src/status_im/translations/en.cljs | 5 + src/status_im/utils/datetime.cljs | 5 +- 58 files changed, 782 insertions(+), 475 deletions(-) create mode 100644 android/app/src/main/res/drawable-hdpi/icon_arrow_right_blue.png create mode 100644 android/app/src/main/res/drawable-hdpi/icon_chats_blue.png create mode 100644 android/app/src/main/res/drawable-hdpi/icon_q_r_blue.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_arrow_right_blue.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_chats_blue.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_q_r_blue.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_arrow_right_blue.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_chats_blue.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_q_r_blue.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_arrow_right_blue.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_chats_blue.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_q_r_blue.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_arrow_right_blue.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_chats_blue.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_q_r_blue.png create mode 100644 ios/StatusIm/Images.xcassets/icon_arrow_right_blue.imageset/Contents.json create mode 100644 ios/StatusIm/Images.xcassets/icon_arrow_right_blue.imageset/icon_arrow_right_blue.png create mode 100644 ios/StatusIm/Images.xcassets/icon_chats_blue.imageset/Contents.json create mode 100644 ios/StatusIm/Images.xcassets/icon_chats_blue.imageset/icon_chats_blue.png create mode 100644 ios/StatusIm/Images.xcassets/icon_q_r_blue.imageset/Contents.json create mode 100644 ios/StatusIm/Images.xcassets/icon_q_r_blue.imageset/icon_q_r_blue.png delete mode 100644 src/status_im/components/action_button.cljs create mode 100644 src/status_im/components/action_button/action_button.cljs create mode 100644 src/status_im/components/action_button/styles.cljs create mode 100644 src/status_im/components/common/common.cljs create mode 100644 src/status_im/components/common/styles.cljs create mode 100644 src/status_im/components/native_action_button.cljs create mode 100644 src/status_im/profile/edit/screen.cljs diff --git a/android/app/src/main/res/drawable-hdpi/icon_arrow_right_blue.png b/android/app/src/main/res/drawable-hdpi/icon_arrow_right_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..a5629972e14dbc4315bf653ea17e2740aa681f03 GIT binary patch literal 463 zcmV;=0WkiFP)Px$iAh93R9Fe^mAy*DKoG}gHsLI<6))D-SLhoE7B+TP3M!H-&P%{nu+UnK)p^lI z3kmoD`V_u_#eI~Dg=b?j?gkPA0NuJ!%7E4uT8D^u zKP!~7J0w7YfQ-k<_>Q-3GXdijU;6IiL1I^Zl>&*wW`&Xh+V#e52x%J_G^#3${e&h! zv_%AS>3(G1jnnF-cELmr=zKKfZLkV*NG}_J?SX4Omjy^&Y7X;OmPE#ffDxJId(~bp zZS`Q-SOxf62O_zaF>3O59j7frBt+==-T9ZQ)1+Efl_cxm@4q&~>BkcRtiPx%(n&-?R9Fe^SG|ik0Rz0VxxtiRu)#`fx>ZUW0OKb#Q0H&hTvIP z8NpLHPok$5N+M!m5s_;|u@DshgtHL5$}^V`@Ti{sz01BhS(OZcG{Pyy5 z1(clra)@z!j>tk@j(+t7?CoeYcF+ryVGn%f!M6>JvwT0mh+K#`^18He(Vkbz0m(>; zON;x+X^W7ld~+-q8q1#x&q=!dPe3k`Vow_rr9 zOakg#qp>L&mmavCLn>R;0SFjceFGfpw)MV60ZMTWDtrg)0Mudq2g0fYVf@qeBaSb$*RXUd8fRK;jhbP3|M<3pNf1~E}olBt3oCi&TrCbIgCVwEQ5|e zDGwoUyrFS%)cg}Kbkg1})dD0cqXt&xAK&>7nlj4l&|mPw|LN2*{14gj#H=AU?>llE?@R#UecSPVFG z$mMNWT1|Y+rq&X*Dx?+J=i=252pQDm!=VA5BVMlQHFZ?T05)qSp|^7Ker3BQuK?p{ zYFM}aJzJ`l>82Q=0k@6SYoAVL=e3~FQ(n!b;~6cd)?!D69-iI&ld6=Yqib!QZeY&X zl~dXI-T)HGbE)`CBM{g_H?$eLq?L35iS>R#x!$S$01!Usr!iFJ#Tk0njma45_R-eU z_d@gcC>?jr?btHu;D_G50JR|_c7!JRE9tLWDOZ#-m|yBuDFIH#T#*XNWL}k$cBWP)Px%&PhZ;R9Fe^mCsKTQ4q&x_N^QQe}IY>NKEvo@mJKS(P*LeO zdprd^1v~{dR{`AU^r6&Z8y1U~TWD)~u)lSoG`~`6XykWfICqE&g%2i~4+>a(p+b#9mIC89RX|`Q*7c^E zD$aRVg}52<4w37ebFuv%PG-)KsZTgz5UFRaFfv}5LZRX8e)?lfaU&Af{;C%3d}b$h z8+!*bX94L6dvCYq5%Y*@w-(>`*3G|~txN^djUX>Nz)g7&bQ-ftQ6WksF>{XpD7_2= zIM2Juzg`%brVOZAQ6F-WoSfv-bsLu=EzcDB?R@$Y+4Ck*TKY&kBF=3Q!hipk@14_c zt?y+(Lor`o6>5MpLk z6&OOrKYF|KQ!NnAwW|VIP`rzH$Bi$S=ih3!Wfc{`UsWL+B9zGV@KJCV3Fe`x>6&)4{fj;4jh+IY0-gdjDDW59^Zf9w S-!%~c0000Px%K}keGR7efAluK{ZKoG}wwjgn$=2V+AMSO)GIU*sH3lUPPs#WEfG)Q1qh^x6F zgp!I!i)~7HKY}3Q#E~O>2H;#fTu81!Jj@tx+&rK(#B=a$W_SO;%Pdr(QTf_O~=a}lNO?bvPu52=lR^9*u=&=VM2Y8?pqWZ{Uh^d}IngJu(FK6b)~ zF^Uou`<;EEU;}dy6=Kz1>yd+r@RZdAIT+6@%( zq7tLGE+CM#9}w>yfN|iGAKe}3GJr3X@iCrD45U{#=PLUJ@!k;_cbgqV_o-ydiTJ<= zw(4cQIthqnMlLlA@uAb-c)puMO>}3&GS(&qjfHWLn?jp6s2Si*vIyW-%`z_VI5+b= hJV+(YF7JPmegOhJ??J0h8Y}<+002ovPDHLkV1n#;5{Uo+ diff --git a/android/app/src/main/res/drawable-hdpi/icon_q_r_blue.png b/android/app/src/main/res/drawable-hdpi/icon_q_r_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ae26f3c5eead3947716780a6099da9a354979e2f GIT binary patch literal 704 zcmV;x0zdtUP)Px%dPzh3?zOOpn)PbPk^HIb_!@nB0&KK z??6KWj}VfUgg2lF$?Y(+ci(C6#xYoXLN0D4YkqeAJUcVH=UlhC45Vd%E>eHCb+VGP zTg}*CZOVAcemUm7-O=D%b5H3M-KhbsO^(Ona5&9b%p;=l&T#ND=B4PW9TQOaci!*E zPG;k@f=s38!p9{bfO<^8CE73Y`wSY8ox3N$yMZRUBQP9YiY{!MfV5_OxvRl!kCtCS z81U)%heJSdjiuDHePGaFQWQw{NdPP}lH)#Pkm-4|2@+Fa?3wtJ@9=UyK z->|fk^atUoP$o9`DY~#>j_mDv|EnXKKwuWsNsXbXaw)p-Vke&sT~d-I}SYh%-8Dy&b4-23qS zz`dsYYH`68xykNuFarPgIX`CRjj~C_tIuVx3W(Xim%Uz)XLhG&0o#PWLephhkpJ=) z3P$A3v^GAzT^aOTI0J)c)5s*m6`BmS@q~yS%!`|VQl1c6GvS!Z%*dQNs0BpyU9x{8 z@Q8Az?5MUcgbAoAFb`c8a8)x+U8%R5Op&*Px$9!W$&R7eeDU>F6XAwc&K$e8{{I%U!m8DcGFB32Ob4#r%%`Y zXZY{U$iVo9nT5q^R<6Wlm^?B~vIV3V4zdVm5Fxt)nf>V5lLbINL6^hyke&}17!83T z`wCyMzzhe`B>RAclgSvQaaOv-HxNAvMni!1ApijB{9$~~{4m`B0000Px$lu1NER7ef&RJ~5aKn%98heO?RJ5dBeNSxH1@3Z}VwwoNl|N89-pj|-tsOO{6=nQnStpOHnpU)yq6uQS-$TewF=g7TP1 z${f4`DR~^v&ci0owgf6=nb00O+)yy zLR1%~lc^_fB>*S2Rutwv5)rqlbh%Hp%i&rAx(8a9OefSazYx%E1cFl>+?07wR)jk$ z5)glKp2m%|4;CL3;0C?7u_32d_$8b1WdSB)5mdNBV|Yb`H$d3U3jF=^2mLIH9{LG} Q6951J07*qoM6N<$f@kg3DF6Tf literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/icon_ok_blue.png b/android/app/src/main/res/drawable-mdpi/icon_ok_blue.png index 8b6c5482cf652f6bbc2bb0534c9e8b6213d38972..dfc5073656d02c8fd3e4e879565c32f77a197970 100644 GIT binary patch literal 490 zcmVPx$q)9|UR7ef&l1okkK@f(kx;3m_xNvwJz=g+ff%xPA8U}>!UN%~3*Nx!fQr#6qqLXf1`dYnmTQ9o9TA%-Vb#uupSrt)e|v6#N^Mhni%-eV zkEKUS3EiqyJUHDg;p8Jj!CBvDMXFq1#!mZ|UPwqFoG8F~8n{EP4JqY{U08Tw;jqy+ zfQ1>;O^{VLG-S35!Um#j2(Nnbjnn`kESAC`8;TXm6hA&vLf>vAAp1 gV}Aymg8s#UAMOaC@w{Q9MgRZ+07*qoM6N<$f;=|csQ>@~ literal 501 zcmVPx$uSrBfR45gtlS?lHQ546|xieE0Qtwtjf_Np^8){`GHg<%d3!6S9UYl;PKv=LC z6+&3}3`oC$h(|oaQl?d}HcE+^;|^)lHf^HJ=H7em`Tz1i=iCAK$2X=tmU#R@mw~{) za(o+4rIC;L9s#v5WRrgajqf~{y~kenh@hE!xiK-5oHxk57AXfU#+^VDB3?s*Bro<= z-m-j3o7jw2kRChufxwj{h^+=BuO4}oXr&G>`yA59g_i(Q+mf?NO&Ixh6HHw}RIACj>y2qqghutDVN> zq(5ZS-Y7sswS2^PGIOmR^<3C#2|hF&B&Zy&!5-400000NkvXXu0mjfqu|`R diff --git a/android/app/src/main/res/drawable-mdpi/icon_q_r_blue.png b/android/app/src/main/res/drawable-mdpi/icon_q_r_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0492d497be6528fd8df45eb0fc36506601a7e501 GIT binary patch literal 388 zcmV-~0ek+5P)Px$K1oDDR7ef<E6zKnz7QQBP1-NOVQ-!Ci>hqV^=M*rFV!_b96%v4Rtz40$cT zvLj2K02`!wF}A+H?TkH6RbAvv2a@$aJiXoZ{b!qVb!+jIs+YQ+HP4UNJMdB-+?qoY zCC5iWd{cSwX9_~=%iGmWol?q2ET?As+RHbE2iM&I08#R>eQ=tigclYtIeu-11#-@( z;ahuL&HAiud8b5x&9>XyUOVFOlG@c`IfVz;-GHaaleCGk^-P7A^2Gn&+RdPJLz_+a zJ}k+62>xi-iz`|XVc>2CrJGE0f~Bo(G4LO4GGDG6kOYY^a902T8E@$QraL;mPqoE@ z5r*Hj$OinC9o~Sg)Ge@wpPj204K%_Cas^l@HkrSt+M?uk0X0Zz63LbZLtKkWHPx$e5md{H9K@`VlBvZ&k9xBM})}bz)N;=xPYjg;@fje!lZV8KXiDkOSlZIY17O z1LOcX@NXU9rj@6&_2EXKxh>|2*hBf;ZuCXxoB^GKxsCP8n?>7(J@H_Coyyh5+}e4~ z83#aN3ywGdmx3{401VC@08#6PFb*&|KC#I-zcK}3{16M_nIa6{Rqsn^|B?*C zIltvBm@K5nYI0sB_60x)G6mrqfGG%10GSgAKfYB*RF>Ll+h)NKbgVPnP6;O`YOmW# z86cIbtl`aa48TIN04*_RH{oC?akw?w=yg2hTgYZ?--vjj7}!j^W3BcoUbIsN;K1rC z6L@I*tkOq$3#}hK%!B=rMYrNA6Ul8khX}4>RL+SQ&q1lM6I;d_zQ61CT^XR;K)vQS zj-FyxyH&p)tEQ+UZ s0%&4#fE*wP$N_SI93ThCfxqd%CptXPKp1R6egFUf07*qoM6N<$f^eSrQ~&?~ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/icon_chats_blue.png b/android/app/src/main/res/drawable-xhdpi/icon_chats_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..31c25b335cbb5fe39cf46077606cce495e37e68e GIT binary patch literal 810 zcmV+_1J(SAP)Px%e5SiNo&K@i@(#Gyf=Ln86L0CY4FEeHWGK!qq0$4CSbQh_MI;ROPb zh=gNPpj04QB#KD1c>o&Pb0Q>!1PCEHA-BvpUf+1{_HO09^BGt-H#44}@0;1(ViP;o57fTYJv`V(3_5($t|frS zX55{Zpzw<%7N2!$)RrVqCmGQuLa|8ygR#Ej9=p}LTkTMLUh?hddw%yYYzo1yMmafR z*oySHq@4ic{48}Z50d{n>|A zmrFZIK{mFKvB$Obpkb4P#%c-RW(=20xMZRMdB}N^&=NqPxEX7$%w1-j)nQAqt6ppy zGI^0mxdX@Wa1tQlZYFg^&qqC4KuOn9ZF?oq#Nq$G3UU-<{&@3ha8m z(|op*7#jfuT?C2DapNMLD`kUqUH=U<2P1f>)L zh(kw$VuaRzpn8&A8UX|&Nx(DxEd~y{?@hCZF}q?Yl>lNv65dqhJUrKLfyfUe1M-^+ o7ZPx&{YgYYRA>e5mrHLGR}{zZnTPEVMO165NEH%Yb%S_Ryq}r54upqzh#OTrKDh!2zHNt-P(rj3GzfSOV9x2=+;D%QBD9IbYH0-D8gqWm!4roPst&Ytvlo-$ zb)eFER4J`BCi{^1N1hu11~avRf4RovPvQ;`yd9JMLa97>kv_6sSk;Gk%=rQA{WY8l+r|-Q!0PXuaf9m<#Z@aHnN<2I z=?r9rSnUP_+t5ub5ox&T)+ZiSrG*Io&y;fjkyddmdSC+q)7rhU;TG2?iz{9L!T*(# z2XVFefrH_Ce;0Iv;BRyNeQ`xwD0*5MgXiQgxVo=&fdSkJDBaq#rSXnSFJMry0>ajt0|alMm%rx2Bjha|^p;}bsmQY5f%d)1Ouuw~!=7Kx zT}9__22IV{)j8Yd`iI74Er8%NFP$XrD!=1knDhqdVD&|s9Ih7=d#*xbOWkPVFE%wD zivr-1UHC7WQ~^6Bk0AUq*Hr-5&0xsdvthb)=|v7a@4&hp&cOKV9pH~zZT9kb1YQ-A zhu{ZO@^`%cTYf$+mDiLJwDxt^r?~zxvFAgKm3==xu~LgiGV%zu#JJ`WboZ#BE#=X7 z-~q1cQ-Up}geL^g0&q|M4`;-E`O@@=JVdRy3`=Pu#80Jst~11*V;`XQHI zf`MlNMvb->*QiVG9BKvaUuYBN)`f`fSD}%ta~z#t%#Y#r;IbynmR+4Q?s2_T@jD>7 zi4z^O9)`?dnEE!S(LZgz>>m7T!mp>CPVn{<=L9~mi*nlNKNMj@^XD(B0Ggzu zXK3!5Y-TGiv%^!g(6)GF+Oz!0{ju+W?||=s?||=s@4$N;cnfE*U1gg&nk4`L002ov JPDHLkV1fqC5gPyi literal 930 zcmV;T16}-yP)|00001b5ch_0Itp) z=>Px&TuDShR7efQm(6PvQ4ql2yi_f{)C!uU=&=`19=sGqsftn*QEOZJVXd~=pok=! z7CcD~dJs#tA|ksnja6Dys9L`&DE!-9vkR{hArTKW(g=F0*Y21CkVC-{QmiCb|{fa?dvbqjUlcjD#Asm~vWRlU0y4DEK`T403#+>t3#<2A5mfDiI_hVrIY3Hm0BttmxkACoW+tEmyngNSP(ux~ZM_l*R6 zvzA_tr~1%jNwT#c3IfSetL{-GKh>YLi|tUjpadMEvhMCL$hK!q{2-5g-yv*dE!AHP zhW=UidSQfr*A58Af`uaFM}!=b&LFd}|YAaSFk1C076 zUk}x!X)$*S>Hctl)6@^#hiGXMYp07*qoM6N<$ Ef+umOV*mgE diff --git a/android/app/src/main/res/drawable-xhdpi/icon_q_r_blue.png b/android/app/src/main/res/drawable-xhdpi/icon_q_r_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..47c6572daca596a0ec1dd636c158201045cc56d8 GIT binary patch literal 691 zcmV;k0!;mhP)Px%ZAnByRA>e5SI;hkK@i{3lC+4#xeme$@DTnz28kwIoH=vlLQ)B@QM^Q7fH-iL zIJ6RfvUb?{YkQsm?cu`0%*|s#>iZjtK)m8_36hvS!q19!3OYYtliRD&E`47?E$FUQe}L>4?-G`?2pjG zra{93hsZOIqOC*G#&+zXv)BU&p=_@+cm>tkI%Kqc!|H6i8qe!nr2#C=}I_2 z^L(ea=I+JHkq-M6`kG<&*2e?HIgdz&XCJBUx2JXsb;$tH!1+(TRpJwkl_PmJ0O^^S z3`$cr0P&ev+H;G?_CoeZWM=!Fi8CPK1z!QrP`@**d8scvNYnK})8C7gBR#ePBp^l4 zc4mSLn};1MN4n7!AcbM0DS$y&VCwdCaSW+o ze0#$%Tf|X>{eyXRw~&Y`$D&TbKP*kXy<2;4boS0^Q_(1LyW*sCIdazCmJqIk4XqJ3 zIIo%2FhqOs0u)!Ys~U+fz)%Q`BBEpMKW2|Fp}Ws#gzpE@e&5`5O47Y8CS=?`!iTz0dPc z&p5Hh*LKz%zD5yQKbOOnn_oWtobc$~uSdsL)$jUr-Rpk``@TWVdj_6-G(t z{O*RDXbzQ92lvOy{wHUgj{=IW{o{N9i=Xc(ZL^wa2NgBeRHi@L8bo2(g}wvA5JQ^ z;Np9B+xYLxnYklX)+7S3YVvCV0}Fr(;n@;0lAz#BV2# zoEBp4JeRcD^Hyo}yLG>J_NIyb4*#fP+&f+L{XI6G4r}vx+j$l7*OvS3)(Dt;;Q!_C zd7CO#lYbxd{d~Op-SlH04WpPvn3kJ5EG&p(6cKW_4aktW>L68cg(>r3AZN+?`Eh@8 zUj|PO-r25UeWdJjD&wnd{6>CvY?$gepNzj<)hN?cF%(XuLtTdbw7G?`wHX6 zhx$KNoFD$Mxx#pK+2)+7X{m{F^YHqpy^Yb-p m!}zKku_gd$vbd%FfxUXReYGavms`Lz%HZkh=d#Wzp$PzTzC!N+ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_chats_blue.png b/android/app/src/main/res/drawable-xxhdpi/icon_chats_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..7f13becbd36f45b8f6b0dade489d403103f27fe4 GIT binary patch literal 1217 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 literal 1464 zcmV;p1xNacP)Px)a!Eu%RA>d=m}^WNRTO~lS@y-l&d{c2R{dd2B;kjDjDKttOA9F>)Jh|(Ev*$> zSmP^DjgKED^TT&Qs-~I+YsK1NDIx(&oBF^A?wxywvH!u-*2Xie7!IposkLjHw1&O`tvwjzF0=1T8mu;W zrjc>J6M^nH#q{^oUhXvDmMmCZ@XRX+QEPxO#y5t4orZ&H#nP$OHEFML&L6V#7#JLs z@|4Z97M-1Oy2ua)2Cu$jKkUMDLwpa?9jBQ^=u%sJam z&e}czKViQ(qTL`sH z=nJs#yq=t*=eI38Z)cNs5sN}K>u+NkZnblmWa#usmXTfDxI?-S$3~=Dd^sIvzY1wB z5zZ<_vjebiJ=s~sFI36{A{&yY&8|pLeIadMTqp+LNUqGHL{J2l7AFsaIv&#BWt?py zr|cd8_}a}p#n0|o9=6k4Whq}{bRx&Y>wa8QeyelSZ8+g!o^>w<<_1OmQo1WnLbW2) zozoE38XT9i-6iUl<%3pDymrbWMi)c6L(z3ZFUC!LGnc%`Bg9oznaCpLz#Em5Tb}C9zjxN|_pfe?>O)k;7zq9K-au$+jcFDSV5o z&37GJJAqK$%e~=I{R14oL|}q%7d~OR%KAn>42f*!D|e`V80EllhY~!T=T8jrkDqE8 zTp_R!iU}$-rgg@HLaL9F4Mh$`cg0;bzIxn=o)&qCj@>Xk{LfKJS&@xZUf0Gm5vmK1 zN$adSqmAp}sO<9Hp3F!YV^3}OjWt(2gA+YxD6A!C?8Z?TIr8|P{wu6HYn!0hfZmNz z#a5ls#`HTPxqTbdDi}6o$t6wZsqWtzo8j(fYCKV&6giP&_D%)S=4_ zMSjf!BVj|0@-Rkb57q4+TytwfV|oYesD}Qrcl2zGR1ZdbwIQ>X2-Pj+DjP3nq>MRd zrJ|vTUeTM*ws02NV#sXDPC3t4!TS5X;m~*wMbpM6CIaY^Wu=04VWCYD6+$qYBYFWG z&|5J=6{0yY3I|c|L;Wox8YfU!6>Nma!KqnToNCXEiQ8x}S*bmTMT?!|;6 zKW*2T89*(BaY^?1X?r%y=TgTbS-YI4+_l(Haz(@n@!7tyHB8R8n3lMUGA>Nf|7OgZu{rZVPx&sYygZRCodHo6T+$F%ZY?r3FzqQ4WaG*WeA{F*r~}drS}#yaEzxa&1I7@DLo} z4S0Nt4 zAVI(;>atZ&#-ATJ;|9i=`_7tePK-65tg+)agPo5Ox6r0mTv_LQmQRnq zZ2kQ`KXlIRhonpP*4m>h*PCaP{ky+%I*Ia^^^e+l*1QNbnx1Q%q1)@n_1 z+Bw^5(ayYt+M;XF;%;@O9ZI*hH*davbmwO{&h4MS`+DR1$)6u_n^rrnJUy-z7pEf} zLFrq$6b=L=+vXk<2pg$|dv;nT+Y;KbgbYyZb%~A@5c6d#AO*w_V9Yv#6c9szG3y9Y zKnwxKtRtusKz_0-r30@IsrpnM*_P05H3%E2l?Y6>CA4D+(YqMT1bRZZV`q4`dOSLg ztCPpRZL+?dWlUO(sTCKeBRj?XG%0rKw4Bq<*-DcTYKs8D9CB$slz&b;XQT9_^-^sS zpv8=zok)XA+rhjvHJb<;wc_IZMS#FzW2+fLhp=;5*-l{6p3|rmH{>OnlManxU+dp5 zwc_HwYgq{>0VSXWl)(Q*px3wgz0vV2{|*TM0lgYywbuBTyXJ5@*m)V-;JCyW>xlu? zSY@#{KAt&eHgUpHdG>a=do8MK4@-Qpp6G2J9BQnxVBkPnOCt*^VJq=nC@eljuNv)B zY)9*YaBx@x1KPN*Z)Fi6=}L%II=4>kRq}~_M1ZQT?ufIka4fn8^cc7vVShSrCISReyIy4xev--bh?|ng*>g4s%h}u1#DL(p zrPIN^1NeoY@7#NTYJ4-9JJ3?ceOvGWU(f(8?)R!CQx+w@OSx->5>Nt4KnW-TC7=Y9 dfD(ua`~&l!z8q3CaF_r9002ovPDHLkV1iq*&w2m= literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_arrow_right_blue.png b/android/app/src/main/res/drawable-xxxhdpi/icon_arrow_right_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..d840b0b5de0f88c6f9c30c392db70f084d97fb45 GIT binary patch literal 916 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 literal 0 HcmV?d00001 diff --git a/ios/StatusIm/Images.xcassets/icon_chats_blue.imageset/Contents.json b/ios/StatusIm/Images.xcassets/icon_chats_blue.imageset/Contents.json new file mode 100644 index 0000000000..93f4992915 --- /dev/null +++ b/ios/StatusIm/Images.xcassets/icon_chats_blue.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_chats_blue.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/StatusIm/Images.xcassets/icon_chats_blue.imageset/icon_chats_blue.png b/ios/StatusIm/Images.xcassets/icon_chats_blue.imageset/icon_chats_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..31c25b335cbb5fe39cf46077606cce495e37e68e GIT binary patch literal 810 zcmV+_1J(SAP)Px%e5SiNo&K@i@(#Gyf=Ln86L0CY4FEeHWGK!qq0$4CSbQh_MI;ROPb zh=gNPpj04QB#KD1c>o&Pb0Q>!1PCEHA-BvpUf+1{_HO09^BGt-H#44}@0;1(ViP;o57fTYJv`V(3_5($t|frS zX55{Zpzw<%7N2!$)RrVqCmGQuLa|8ygR#Ej9=p}LTkTMLUh?hddw%yYYzo1yMmafR z*oySHq@4ic{48}Z50d{n>|A zmrFZIK{mFKvB$Obpkb4P#%c-RW(=20xMZRMdB}N^&=NqPxEX7$%w1-j)nQAqt6ppy zGI^0mxdX@Wa1tQlZYFg^&qqC4KuOn9ZF?oq#Nq$G3UU-<{&@3ha8m z(|op*7#jfuT?C2DapNMLD`kUqUH=U<2P1f>)L zh(kw$VuaRzpn8&A8UX|&Nx(DxEd~y{?@hCZF}q?Yl>lNv65dqhJUrKLfyfUe1M-^+ o7ZPx&{YgYYRA>e5mrHLGR}{zZnTPEVMO165NEH%Yb%S_Ryq}r54upqzh#OTrKDh!2zHNt-P(rj3GzfSOV9x2=+;D%QBD9IbYH0-D8gqWm!4roPst&Ytvlo-$ zb)eFER4J`BCi{^1N1hu11~avRf4RovPvQ;`yd9JMLa97>kv_6sSk;Gk%=rQA{WY8l+r|-Q!0PXuaf9m<#Z@aHnN<2I z=?r9rSnUP_+t5ub5ox&T)+ZiSrG*Io&y;fjkyddmdSC+q)7rhU;TG2?iz{9L!T*(# z2XVFefrH_Ce;0Iv;BRyNeQ`xwD0*5MgXiQgxVo=&fdSkJDBaq#rSXnSFJMry0>ajt0|alMm%rx2Bjha|^p;}bsmQY5f%d)1Ouuw~!=7Kx zT}9__22IV{)j8Yd`iI74Er8%NFP$XrD!=1knDhqdVD&|s9Ih7=d#*xbOWkPVFE%wD zivr-1UHC7WQ~^6Bk0AUq*Hr-5&0xsdvthb)=|v7a@4&hp&cOKV9pH~zZT9kb1YQ-A zhu{ZO@^`%cTYf$+mDiLJwDxt^r?~zxvFAgKm3==xu~LgiGV%zu#JJ`WboZ#BE#=X7 z-~q1cQ-Up}geL^g0&q|M4`;-E`O@@=JVdRy3`=Pu#80Jst~11*V;`XQHI zf`MlNMvb->*QiVG9BKvaUuYBN)`f`fSD}%ta~z#t%#Y#r;IbynmR+4Q?s2_T@jD>7 zi4z^O9)`?dnEE!S(LZgz>>m7T!mp>CPVn{<=L9~mi*nlNKNMj@^XD(B0Ggzu zXK3!5Y-TGiv%^!g(6)GF+Oz!0{ju+W?||=s?||=s@4$N;cnfE*U1gg&nk4`L002ov JPDHLkV1fqC5gPyi literal 1464 zcmV;p1xNacP)Px)a!Eu%RA>d=m}^WNRTO~lS@y-l&d{c2R{dd2B;kjDjDKttOA9F>)Jh|(Ev*$> zSmP^DjgKED^TT&Qs-~I+YsK1NDIx(&oBF^A?wxywvH!u-*2Xie7!IposkLjHw1&O`tvwjzF0=1T8mu;W zrjc>J6M^nH#q{^oUhXvDmMmCZ@XRX+QEPxO#y5t4orZ&H#nP$OHEFML&L6V#7#JLs z@|4Z97M-1Oy2ua)2Cu$jKkUMDLwpa?9jBQ^=u%sJam z&e}czKViQ(qTL`sH z=nJs#yq=t*=eI38Z)cNs5sN}K>u+NkZnblmWa#usmXTfDxI?-S$3~=Dd^sIvzY1wB z5zZ<_vjebiJ=s~sFI36{A{&yY&8|pLeIadMTqp+LNUqGHL{J2l7AFsaIv&#BWt?py zr|cd8_}a}p#n0|o9=6k4Whq}{bRx&Y>wa8QeyelSZ8+g!o^>w<<_1OmQo1WnLbW2) zozoE38XT9i-6iUl<%3pDymrbWMi)c6L(z3ZFUC!LGnc%`Bg9oznaCpLz#Em5Tb}C9zjxN|_pfe?>O)k;7zq9K-au$+jcFDSV5o z&37GJJAqK$%e~=I{R14oL|}q%7d~OR%KAn>42f*!D|e`V80EllhY~!T=T8jrkDqE8 zTp_R!iU}$-rgg@HLaL9F4Mh$`cg0;bzIxn=o)&qCj@>Xk{LfKJS&@xZUf0Gm5vmK1 zN$adSqmAp}sO<9Hp3F!YV^3}OjWt(2gA+YxD6A!C?8Z?TIr8|P{wu6HYn!0hfZmNz z#a5ls#`HTPxqTbdDi}6o$t6wZsqWtzo8j(fYCKV&6giP&_D%)S=4_ zMSjf!BVj|0@-Rkb57q4+TytwfV|oYesD}Qrcl2zGR1ZdbwIQ>X2-Pj+DjP3nq>MRd zrJ|vTUeTM*ws02NV#sXDPC3t4!TS5X;m~*wMbpM6CIaY^Wu=04VWCYD6+$qYBYFWG z&|5J=6{0yY3I|c|L;Wox8YfU!6>Nma!KqnToNCXEiQ8x}S*bmTMT?!|;6 zKW*2T89*(BaY^?1X?r%y=TgTbS-YI4+_l(Haz(@n@!7tyHB8R8n3lMUGA>Nf|7OgZu{rZVPx%ZAnByRA>e5SI;hkK@i{3lC+4#xeme$@DTnz28kwIoH=vlLQ)B@QM^Q7fH-iL zIJ6RfvUb?{YkQsm?cu`0%*|s#>iZjtK)m8_36hvS!q19!3OYYtliRD&E`47?E$FUQe}L>4?-G`?2pjG zra{93hsZOIqOC*G#&+zXv)BU&p=_@+cm>tkI%Kqc!|H6i8qe!nr2#C=}I_2 z^L(ea=I+JHkq-M6`kG<&*2e?HIgdz&XCJBUx2JXsb;$tH!1+(TRpJwkl_PmJ0O^^S z3`$cr0P&ev+H;G?_CoeZWM=!Fi8CPK1z!QrP`@**d8scvNYnK})8C7gBR#ePBp^l4 zc4mSLn};1MN4n7!AcbM0DS$y&js opts))) +(defn share-options [text] + [{:text (label :t/sharing-copy-to-clipboard) :value #(copy-to-clipboard text)} + {:text (label :t/sharing-share) :value #(open {:message text})}]) + (defn share [text dialog-title] (let [list-selection-fn (:list-selection-fn platform-specific)] (list-selection-fn {:title dialog-title diff --git a/src/status_im/components/native_action_button.cljs b/src/status_im/components/native_action_button.cljs new file mode 100644 index 0000000000..8ff80c068f --- /dev/null +++ b/src/status_im/components/native_action_button.cljs @@ -0,0 +1,7 @@ +(ns status-im.components.native-action-button + (:require [reagent.core :as r])) + +(def class (js/require "react-native-action-button")) + +(def native-action-button (r/adapt-react-class (.-default class))) +(def native-action-button-item (r/adapt-react-class (.. class -default -Item))) diff --git a/src/status_im/components/styles.cljs b/src/status_im/components/styles.cljs index c5a404bf45..861a304d78 100644 --- a/src/status_im/components/styles.cljs +++ b/src/status_im/components/styles.cljs @@ -13,6 +13,7 @@ (def color-steel "#838b91") (def color-white "white") (def color-light-blue "#628fe3") +(def color-light-blue-transparent "#628fe333") (def color-light-blue2 "#eff3fc") (def color-light-gray "#EEF2F5") (def color-red "red") diff --git a/src/status_im/components/text_field/view.cljs b/src/status_im/components/text_field/view.cljs index b1ba7ae6a7..c051d8a934 100644 --- a/src/status_im/components/text_field/view.cljs +++ b/src/status_im/components/text_field/view.cljs @@ -92,8 +92,7 @@ (log/debug "Input blurred") (r/set-state component {:has-focus false :float-label? (if (s/blank? value) false true)}) - (when (s/blank? value) - (field-animation animation)) + (field-animation animation) (when onBlur (onBlur))) (defn get-width [event] @@ -113,7 +112,8 @@ max-length]} (r/state component) {:keys [wrapper-style input-style label-hidden? line-color focus-line-color focus-line-height secure-text-entry label-color error-color error label value on-focus on-blur validator - auto-focus on-change-text on-change on-end-editing editable placeholder auto-capitalize]} + auto-focus on-change-text on-change on-end-editing editable placeholder auto-capitalize + multiline number-of-lines]} (merge default-props (r/props component)) line-color (if error error-color line-color) focus-line-color (if error error-color focus-line-color) @@ -127,6 +127,8 @@ :style (merge st/text-input input-style) :placeholder (or placeholder "") :editable editable + :multiline multiline + :number-of-lines number-of-lines :secure-text-entry secure-text-entry :auto-capitalize auto-capitalize :on-focus #(on-input-focus {:component component diff --git a/src/status_im/components/toolbar_new/view.cljs b/src/status_im/components/toolbar_new/view.cljs index 5b98f13599..7e63af229c 100644 --- a/src/status_im/components/toolbar_new/view.cljs +++ b/src/status_im/components/toolbar_new/view.cljs @@ -23,6 +23,7 @@ custom-action :custom-action background-color :background-color custom-content :custom-content + hide-border? :hide-border? style :style}] (let [style (merge (st/toolbar-wrapper background-color) style)] [view {:style style} @@ -63,8 +64,9 @@ {:key (str "action-" action-image)})) custom-action)]] [sync-state-gradient-view] - [view st/toolbar-border-container - [view st/toolbar-border]]])) + (when-not hide-border? + [view st/toolbar-border-container + [view st/toolbar-border]])])) (def search-text-input (r/atom nil)) diff --git a/src/status_im/contacts/screen.cljs b/src/status_im/contacts/screen.cljs index fde74ed231..3b5e94de03 100644 --- a/src/status_im/contacts/screen.cljs +++ b/src/status_im/contacts/screen.cljs @@ -3,17 +3,18 @@ (:require [reagent.core :as r] [clojure.string :as str] [re-frame.core :refer [subscribe dispatch dispatch-sync]] + [status-im.components.common.common :refer [separator]] [status-im.components.react :refer [view text image icon touchable-highlight - linear-gradient scroll-view list-view list-item] :as react] - [status-im.components.action-button :refer [action-button - action-button-item]] + [status-im.components.common.common :refer [top-shaddow bottom-shaddow]] + [status-im.components.native-action-button :refer [native-action-button + native-action-button-item]] [status-im.components.status-bar :refer [status-bar]] [status-im.components.toolbar-new.view :refer [toolbar]] [status-im.components.toolbar-new.actions :as act] @@ -73,22 +74,14 @@ (when extended? [options-btn group])]) -(defn group-top-view [] - [linear-gradient {:style st/contact-group-header-gradient-bottom - :colors st/contact-group-header-gradient-bottom-colors}]) - -(defn group-bottom-view [] - [linear-gradient {:style st/contact-group-header-gradient-top - :colors st/contact-group-header-gradient-top-colors}]) - (defn contact-group-form [{:keys [contacts contacts-count group edit? click-handler]}] - (let [shadows? (get-in platform-specific [:contacts :group-block-shadows?]) + (let [shadows? (get-in platform-specific [:group-block-shadows?]) subtitle (:name group)] [view st/contact-group (when subtitle [subtitle-view subtitle contacts-count group edit?]) (when (and subtitle shadows?) - [group-top-view]) + [top-shaddow]) [view st/contacts-list [view st/contact-list-spacing] (doall @@ -108,13 +101,11 @@ (:group-id group)]) :text (label :t/remove-from-group)}])}] (when-not (= contact (last contacts)) - [view st/contact-item-separator-wrapper - [view st/contact-item-separator]])]) + [separator st/contact-item-separator])]) contacts))] (when (< contacts-limit contacts-count) [view - [view st/contact-item-separator-wrapper - [view st/contact-item-separator]] + [separator st/contact-item-separator] [view st/show-all [touchable-highlight {:on-press #(do (when edit? @@ -126,7 +117,7 @@ :font (get-in platform-specific [:component-styles :contacts :show-all-text-font])} (str (- contacts-count contacts-limit) " " (label :t/more))]]]]]) (when shadows? - [group-bottom-view])])) + [bottom-shaddow])])) (defview contact-group-view [{:keys [group] :as params}] [contacts [:all-added-group-contacts-with-limit (:group-id group) contacts-limit] @@ -135,12 +126,12 @@ :contacts-count contacts-count})]) (defn contacts-action-button [] - [action-button {:button-color color-blue - :offset-x 16 - :offset-y 22 - :hide-shadow true - :spacing 13} - [action-button-item + [native-action-button {:button-color color-blue + :offset-x 16 + :offset-y 22 + :hide-shadow true + :spacing 13} + [native-action-button-item {:title (label :t/new-contact) :buttonColor :#9b59b6 :onPress #(dispatch [:navigate-to :new-contact])} diff --git a/src/status_im/contacts/styles.cljs b/src/status_im/contacts/styles.cljs index 3d88cf27c4..6c07c0af4c 100644 --- a/src/status_im/contacts/styles.cljs +++ b/src/status_im/contacts/styles.cljs @@ -52,25 +52,6 @@ {:margin-left 8 :opacity 0.6}) -(def contact-group-header-gradient-top - {:flexDirection :row - :height 3 - :backgroundColor toolbar-background2}) - -(def contact-group-header-gradient-top-colors - ["rgba(24, 52, 76, 0.165)" - "rgba(24, 52, 76, 0.03)" - "rgba(24, 52, 76, 0.01)"]) - -(def contact-group-header-gradient-bottom - {:flexDirection :row - :height 2 - :backgroundColor toolbar-background2}) - -(def contact-group-header-gradient-bottom-colors - ["rgba(24, 52, 76, 0.01)" - "rgba(24, 52, 76, 0.05)"]) - (def show-all (merge (get-in p/platform-specific [:component-styles :contacts :show-all]) {:flexDirection :row @@ -80,11 +61,8 @@ (def show-all-text (get-in p/platform-specific [:component-styles :contacts :show-all-text])) -(def contact-item-separator-wrapper - {:background-color color-white}) - (def contact-item-separator - (get-in p/platform-specific [:component-styles :contacts :separator])) + {:margin-left 72}) (def contact-container (merge (get-in p/platform-specific [:component-styles :contacts :contact-container]) @@ -155,13 +133,6 @@ :alignItems :center :justifyContent :center}) -(def search-btn - {:width 24 - :height 56 - :margin-right 24 - :alignItems :center - :justifyContent :center}) - ; New contact (def contact-form-container diff --git a/src/status_im/contacts/views/contact_list.cljs b/src/status_im/contacts/views/contact_list.cljs index aed9ece9c3..61d5424f83 100644 --- a/src/status_im/contacts/views/contact_list.cljs +++ b/src/status_im/contacts/views/contact_list.cljs @@ -1,6 +1,7 @@ (ns status-im.contacts.views.contact-list (:require-macros [status-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] + [status-im.components.common.common :refer [separator]] [status-im.components.react :refer [view text image icon @@ -114,8 +115,7 @@ (defn render-separator [_ row-id _] (list-item ^{:key row-id} - [view st/contact-item-separator-wrapper - [view st/contact-item-separator]])) + [separator st/contact-item-separator])) (defview contacts-list-view [group modal click-handler action edit?] [contacts [:all-added-group-contacts-filtered (:group-id group)] diff --git a/src/status_im/ios/core.cljs b/src/status_im/ios/core.cljs index 2d2c5ee656..d6544f1f89 100644 --- a/src/status_im/ios/core.cljs +++ b/src/status_im/ios/core.cljs @@ -37,6 +37,7 @@ [status-im.participants.views.remove :refer [remove-participants]] [status-im.group-settings.screen :refer [group-settings]] [status-im.profile.screen :refer [profile my-profile]] + [status-im.profile.edit.screen :refer [edit-my-profile]] [status-im.profile.photo-capture.screen :refer [profile-photo-capture]] status-im.data-store.core [taoensso.timbre :as log] @@ -114,11 +115,13 @@ :qr-scanner qr-scanner :chat chat :profile profile + :my-profile my-profile + :edit-my-profile edit-my-profile :profile-photo-capture profile-photo-capture :accounts accounts :login login - :recover recover - :my-profile my-profile)] + :recover recover)] + [view {:flex 1} [component] diff --git a/src/status_im/ios/platform.cljs b/src/status_im/ios/platform.cljs index 89f94dfa66..d3b43370a2 100644 --- a/src/status_im/ios/platform.cljs +++ b/src/status_im/ios/platform.cljs @@ -77,10 +77,6 @@ :subtitle-count {:color styles/color-gray4 :font-size 16 :letter-spacing -0.2} - :separator {:margin-left 72 - :height 1 - :background-color styles/color-gray5 - :opacity 0.5} :info-container {:margin-left 16} :contact-inner-container {:height 63} :icon-check {:border-radius 50 @@ -104,6 +100,29 @@ :line-height 20 :letter-spacing -0.2 :color styles/text1-color}} + :profile {:profile-bage {:padding-top 24} + :profile-name-text {:font-size 17 + :line-height 20 + :letter-spacing -0.2} + :profile-status-text {:font-size 14 + :line-height 20 + :letter-spacing -0.2} + :profile-setting-item {:padding-left 16 + :padding-right 16 + :height 73} + :profile-setting-title {:font-size 14 + :letter-spacing -0.2} + :profile-setting-text {:font-size 17 + :letter-spacing -0.2} + :profile-setting-spacing {:height 10} + :add-to-contacts-text {:font-size 17 + :line-height 20 + :letter-spacing -0.2} + :edit-name-title {:font-size 13 + :letter-spacing -0.1} + :profile-icon-edit-text {:font-size 15 + :line-height 20 + :letter-spacing -0.2}} :new-group {:group-name-text {:font-size 13} :members-text {:letter-spacing -0.2 :font-size 16} @@ -144,6 +163,15 @@ :font-size 17 :line-height 20 :letter-spacing -0.2} + :action-button-label {:color styles/color-light-blue + :letter-spacing -0.2 + :font-size 17 + :line-height 20} + :action-button-icon-container {:background-color styles/color-light-blue-transparent} + :action-button {:height 64} + :separator {:height 1 + :background-color styles/color-gray5 + :opacity 0.5} :bottom-gradient {:height 1} :input-label {:left 0} :input-error-text {:margin-left 0} @@ -159,7 +187,8 @@ :toolbar-last-activity {:color styles/text2-color :background-color :transparent :top 0 - :font-size 14}}) + :font-size 14} + :text-field-focus-line-height 1}) (def fonts {:light {:font-family "SFUIText-Light"} @@ -196,10 +225,10 @@ :render-separator? true} :uppercase? false :contacts {:action-button? false - :new-contact-in-toolbar? true - :group-block-shadows? false} + :new-contact-in-toolbar? true} + :group-block-shadows? false :discover {:uppercase-subtitles? true} :public-group-icon-container {:margin-top 2} :private-group-icon-container {:margin-top 2} - :group-chat-focus-line-height 1 :public-group-chat-hash-style {:top 6 :left 3}}) + diff --git a/src/status_im/new_group/styles.cljs b/src/status_im/new_group/styles.cljs index 2a46c058b3..ede18b385a 100644 --- a/src/status_im/new_group/styles.cljs +++ b/src/status_im/new_group/styles.cljs @@ -62,7 +62,7 @@ (get-in platform-specific [:public-group-chat-hash-style]))) (def group-chat-focus-line-height - (get-in platform-specific [:group-chat-focus-line-height])) + (get-in platform-specific [:component-styles :text-field-focus-line-height])) (def group-chat-name-wrapper {:padding-top 0 diff --git a/src/status_im/new_group/views/chat_group_settings.cljs b/src/status_im/new_group/views/chat_group_settings.cljs index f89a27032d..f801fd1a2f 100644 --- a/src/status_im/new_group/views/chat_group_settings.cljs +++ b/src/status_im/new_group/views/chat_group_settings.cljs @@ -68,7 +68,7 @@ [view st/group-container [view {:flex 1} [group-toolbar type true] - [scroll-view {:keyboardShouldPersistTaps true} + [scroll-view [group-name-view] [chat-group-members] [view st/separator] diff --git a/src/status_im/new_group/views/contact_toggle_list.cljs b/src/status_im/new_group/views/contact_toggle_list.cljs index 25178f7d6e..5e549fb404 100644 --- a/src/status_im/new_group/views/contact_toggle_list.cljs +++ b/src/status_im/new_group/views/contact_toggle_list.cljs @@ -12,7 +12,7 @@ [status-im.utils.listview :refer [to-datasource]] [status-im.new-group.views.toggle-contact :refer [group-toggle-contact group-toggle-participant]] - [status-im.new-group.views.group :refer [separator]] + [status-im.components.common.common :refer [separator]] [status-im.new-group.styles :as st] [status-im.contacts.styles :as cst] [status-im.i18n :refer [label]] @@ -41,7 +41,7 @@ (defn render-separator [_ row-id _] (list-item ^{:key row-id} - [separator])) + [separator cst/contact-item-separator])) (defn render-spacing [] #(list-item [view cst/contact-list-spacing])) diff --git a/src/status_im/new_group/views/group.cljs b/src/status_im/new_group/views/group.cljs index 2a2dc96fd4..b8a8f8cd80 100644 --- a/src/status_im/new_group/views/group.cljs +++ b/src/status_im/new_group/views/group.cljs @@ -2,6 +2,7 @@ (:require-macros [status-im.utils.views :refer [defview]]) (:require [re-frame.core :refer [dispatch]] [status-im.contacts.styles :as cst] + [status-im.components.common.common :as cmn] [status-im.components.react :refer [view text icon @@ -15,8 +16,7 @@ [status-im.i18n :refer [label]])) (defn separator [] - [view cst/contact-item-separator-wrapper - [view cst/contact-item-separator]]) + [cmn/separator cst/contact-item-separator]) (defview group-name-input [] [new-group-name [:get :new-chat-name]] @@ -99,8 +99,7 @@ (defn more-btn [contacts-limit contacts-count on-press] [view - [view cst/contact-item-separator-wrapper - [view cst/contact-item-separator]] + [separator] [view cst/show-all [touchable-highlight {:on-press on-press} [view diff --git a/src/status_im/new_group/views/reorder_groups.cljs b/src/status_im/new_group/views/reorder_groups.cljs index 803fce4683..28fa96cd43 100644 --- a/src/status_im/new_group/views/reorder_groups.cljs +++ b/src/status_im/new_group/views/reorder_groups.cljs @@ -4,17 +4,16 @@ [status-im.components.react :refer [view text icon - linear-gradient touchable-highlight list-item]] [status-im.components.confirm-button :refer [confirm-button]] [status-im.components.status-bar :refer [status-bar]] [status-im.components.toolbar-new.view :refer [toolbar]] [status-im.components.sortable-list-view :refer [sortable-list-view sortable-item]] + [status-im.components.common.common :refer [top-shaddow bottom-shaddow]] [status-im.utils.listview :refer [to-datasource]] [status-im.utils.platform :refer [android?]] [status-im.new-group.styles :as st] - [status-im.contacts.styles :as cst] [status-im.i18n :refer [label label-pluralize]] [status-im.utils.platform :refer [platform-specific]] [reagent.core :as r])) @@ -35,14 +34,6 @@ [view st/order-item-icon [icon :grab_gray]]]])) -(defn top-shaddow [] - [linear-gradient {:style cst/contact-group-header-gradient-bottom - :colors cst/contact-group-header-gradient-bottom-colors}]) - -(defn bottom-shaddow [] - [linear-gradient {:style cst/contact-group-header-gradient-top - :colors cst/contact-group-header-gradient-top-colors}]) - (defn render-separator [last shadows?] (fn [_ row-id _] (list-item @@ -57,7 +48,7 @@ (defview reorder-groups [] [groups [:get :contact-groups] order [:get :groups-order] - shadows? (get-in platform-specific [:contacts :group-block-shadows?])] + shadows? (get-in platform-specific [:group-block-shadows?])] (let [this (r/current-component)] [view st/reorder-groups-container [status-bar] diff --git a/src/status_im/profile/edit/screen.cljs b/src/status_im/profile/edit/screen.cljs new file mode 100644 index 0000000000..c5aa2a2f13 --- /dev/null +++ b/src/status_im/profile/edit/screen.cljs @@ -0,0 +1,90 @@ +(ns status-im.profile.edit.screen + (:require-macros [status-im.utils.views :refer [defview]]) + (:require [status-im.profile.styles :as st] + [status-im.components.styles :refer [color-blue color-gray5]] + [re-frame.core :refer [dispatch]] + [status-im.components.status-bar :refer [status-bar]] + [status-im.components.toolbar-new.view :refer [toolbar]] + [status-im.components.toolbar-new.actions :as act] + [status-im.components.text-field.view :refer [text-field]] + [status-im.i18n :refer [label]] + [status-im.components.confirm-button :refer [confirm-button]] + [status-im.components.chat-icon.screen :refer [my-profile-icon]] + [status-im.components.context-menu :refer [context-menu]] + [status-im.profile.validations :as v] + [status-im.components.react :refer [view + scroll-view + text + touchable-highlight + text-input]] + [cljs.spec :as s])) + +(defn edit-my-profile-toolbartoolbar [] + [toolbar {:title (label :t/edit-profile) + :actions [{:image :blank}]}]) + +(defview profile-name-input [] + [new-profile-name [:get-in [:profile-edit :name]]] + [view + [text-field + {:wrapper-style st/profile-name-wrapper + :line-color st/edit-line-color + :focus-line-color st/profile-focus-line-color + :focus-line-height st/profile-focus-line-height + :label-hidden? true + :input-style st/profile-name-input + :on-change-text #(dispatch [:set-in [:profile-edit :name] %]) + :value new-profile-name}]]) + +(def profile-icon-options + [{:text (label :t/image-source-gallery) :value #(dispatch [:open-image-picker])} + {:text (label :t/image-source-make-photo) :value #(dispatch [:navigate-to :profile-photo-capture])}]) + +(defn edit-profile-bage [contact] + [view st/edit-profile-bage + [view + [context-menu + [my-profile-icon {:account contact + :edit? true}] + profile-icon-options]] + [view st/edit-profile-name-container + [text {:style st/edit-name-title} + (label :t/name)] + [profile-name-input]]]) + +(defn edit-profile-status [{:keys [status]}] + [view st/edit-profile-status + [view + [text {:style st/edit-status-title} "Status"] + [view + [text-field + {:wrapper-style st/profile-status-wrapper + :line-color st/edit-line-color + :focus-line-color st/profile-focus-line-color + :focus-line-height st/profile-focus-line-height + :multiline true + :max-length 140 + :placeholder (label :t/profile-no-status) + :label-hidden? true + :input-style st/profile-status-input + :on-change-text #(dispatch [:set-in [:profile-edit :status] %]) + :value status}]]]]) + +(defview edit-my-profile [] + [current-account [:get-current-account] + changed-account [:get :profile-edit]] + (let [profile-edit-data-valid? (s/valid? ::v/profile changed-account) + profile-edit-data-changed? (or (not= (:name current-account) (:name changed-account)) + (not= (:status current-account) (:status changed-account)) + (not= (:photo-path current-account) (:photo-path changed-account)))] + [view st/profile + [status-bar] + [edit-my-profile-toolbartoolbar] + [view {:flex 1} + [scroll-view st/edit-my-profile-form + [edit-profile-bage changed-account] + [edit-profile-status changed-account]]] + (when (and profile-edit-data-changed? profile-edit-data-valid?) + [confirm-button (label :t/save) #(do + (dispatch [:check-status-change (:status changed-account)]) + (dispatch [:account-update changed-account]))])])) diff --git a/src/status_im/profile/handlers.cljs b/src/status_im/profile/handlers.cljs index 3b7b2b9a51..0d248257b7 100644 --- a/src/status_im/profile/handlers.cljs +++ b/src/status_im/profile/handlers.cljs @@ -1,5 +1,5 @@ (ns status-im.profile.handlers - (:require [re-frame.core :refer [subscribe dispatch]] + (:require [re-frame.core :refer [subscribe dispatch after]] [status-im.utils.handlers :refer [register-handler]] [status-im.components.react :refer [show-image-picker]] [status-im.utils.image-processing :refer [img->base64]] @@ -44,3 +44,23 @@ (fn [db _] (dispatch [:navigate-to :chat console-chat-id]) (dispatch [:set-chat-command :phone])))) + +(register-handler :open-chat-with-the-send-transaction + (u/side-effect! + (fn [db [_ chat-id]] + (dispatch [:navigate-to :chat chat-id]) + (dispatch [:set-chat-command :send])))) + +(defn prepare-edit-profile + [{:keys [current-account-id] :as db} _] + (let [current-account (select-keys (get-in db [:accounts current-account-id]) + [:name :photo-path :status])] + (update-in db [:profile-edit] merge current-account))) + +(defn open-edit-profile [_ _] + (dispatch [:navigate-to :edit-my-profile])) + +(register-handler + :open-edit-my-profile + (-> prepare-edit-profile + ((after open-edit-profile)))) diff --git a/src/status_im/profile/screen.cljs b/src/status_im/profile/screen.cljs index 7e3ffb68b5..dec7b8a251 100644 --- a/src/status_im/profile/screen.cljs +++ b/src/status_im/profile/screen.cljs @@ -1,241 +1,211 @@ (ns status-im.profile.screen (:require-macros [status-im.utils.views :refer [defview]]) - (:require [re-frame.core :refer [subscribe dispatch]] + (:require [re-frame.core :refer [dispatch]] [clojure.string :as str] - [cljs.spec :as s] [reagent.core :as r] + [status-im.contacts.styles :as cst] + [status-im.components.common.common :refer [separator]] + [status-im.components.styles :refer [color-blue color-gray5]] + [status-im.components.context-menu :refer [context-menu]] + [status-im.components.action-button.action-button :refer [action-button + action-separator]] + [status-im.components.common.common :refer [top-shaddow bottom-shaddow]] [status-im.components.react :refer [view text text-input image icon - modal scroll-view - touchable-highlight - touchable-opacity - touchable-without-feedback - show-image-picker - dismiss-keyboard!]] - [status-im.components.icons.custom-icons :refer [oct-icon]] + touchable-highlight]] [status-im.components.chat-icon.screen :refer [my-profile-icon]] [status-im.components.status-bar :refer [status-bar]] - [status-im.components.text-field.view :refer [text-field]] - [status-im.components.selectable-field.view :refer [selectable-field]] - [status-im.components.status-view.view :refer [status-view]] - [status-im.components.list-selection :refer [share]] - [status-im.utils.phone-number :refer [format-phone-number]] - [status-im.utils.image-processing :refer [img->base64]] - [status-im.utils.platform :refer [platform-specific]] + [status-im.components.toolbar-new.view :refer [toolbar]] + [status-im.components.toolbar-new.actions :as act] + [status-im.components.list-selection :refer [share-options]] + [status-im.utils.platform :refer [platform-specific android?]] [status-im.profile.handlers :refer [message-user]] - [status-im.profile.validations :as v] [status-im.profile.styles :as st] - [status-im.utils.random :refer [id]] - [status-im.utils.utils :refer [clean-text]] - [status-im.components.image-button.view :refer [show-qr-button]] - [status-im.i18n :refer [label - get-contact-translated]] - [status-im.constants :refer [console-chat-id wallet-chat-id]])) + [status-im.i18n :refer [label]] + [status-im.utils.datetime :as time])) -(defn toolbar [{:keys [account edit?]}] - (let [profile-edit-data-valid? (s/valid? ::v/profile account)] - [view - [touchable-highlight {:style st/back-btn-touchable - :on-press (fn [] - (dispatch [:set-in [:profile-edit :edit?] false]) - (dispatch [:set-in [:profile-edit :name] nil]) - (dispatch [:navigate-back]))} - [view st/back-btn-container - [icon :back st/back-btn-icon]]] - [touchable-highlight {:style st/actions-btn-touchable - :on-press (fn [] - (if edit? - (when profile-edit-data-valid? - (dismiss-keyboard!) - (dispatch [:check-status-change (:status account)]) - (dispatch [:account-update account]) - (dispatch [:set-in [:profile-edit :edit?] false])) - (dispatch [:set :profile-edit (merge account {:edit? true})])))} - [view st/actions-btn-container - (if edit? - [oct-icon {:name :check - :style (st/ok-btn-icon profile-edit-data-valid?)}] - [icon :dots st/edit-btn-icon])]]])) -(defn status-image-view [_] - (let [component (r/current-component) - just-opened? (r/atom true) - input-ref (r/atom nil) - set-status-height #(let [height (-> (.-nativeEvent %) - (.-contentSize) - (.-height))] - (r/set-state component {:height height}))] - (r/create-class - {:reagent-render - (fn [{{:keys [whisper-identity - name - status - photo-path]} :account - edit? :edit?}] - [view st/status-block - [view st/user-photo-container +(defn my-profile-toolbar [] + [toolbar {:actions [(act/opts [{:value #(dispatch [:open-edit-my-profile]) + :text (label :t/edit)}])]}]) - (if edit? - [touchable-highlight {:on-press (fn [] - (let [list-selection-fn (:list-selection-fn platform-specific)] - (dispatch [:open-image-source-selector list-selection-fn])))} - [view - [my-profile-icon {:account {:photo-path photo-path - :name name} - :edit? edit?}]]] - [my-profile-icon {:account {:photo-path photo-path - :name name} - :edit? edit?}])] - [text-field - {:line-color :white - :focus-line-color :white - :editable edit? - :input-style (st/username-input edit? (s/valid? ::v/name name)) - :wrapper-style st/username-wrapper - :value (get-contact-translated whisper-identity :name name) - :on-change-text #(dispatch [:set-in [:profile-edit :name] %])}] - (if (or edit? @just-opened?) - [text-input {:ref #(reset! input-ref %) - :style (st/status-input (:height (r/state component))) - :multiline true - :editable true - :on-content-size-change #(do (set-status-height %) - (reset! just-opened? false)) - :max-length 140 - :placeholder (label :t/profile-no-status) - :on-change-text #(let [status (clean-text %)] - (if (str/includes? % "\n") - (.blur @input-ref) - (dispatch [:set-in [:profile-edit :status] status]))) - :default-value status}] - [status-view {:style (st/status-text (:height (r/state component))) - :status status}])])}))) +(defn online-text [last-online] + (let [last-online-date (time/to-date last-online) + now-date (time/now)] + (if (and (pos? last-online) + (<= last-online-date now-date)) + (time/time-ago last-online-date) + (label :t/active-unknown)))) -(defview profile [] - [{whisper-identity :whisper-identity - address :address - username :name - photo-path :photo-path - phone :phone - status :status - :as contact} [:contact]] - [scroll-view {:style st/profile} - [status-bar] - [view - [touchable-highlight {:style st/back-btn-touchable - :on-press (fn [] - (dispatch [:navigate-back]))} - [view (get-in platform-specific [:component-styles :toolbar-nav-action]) - [icon :back st/back-btn-icon]]] - ;; TODO not implemented - #_[touchable-highlight {:style st/actions-btn-touchable - :on-press (fn [] - (.log js/console "Dots pressed!"))} - [view st/actions-btn-container - [icon :dots st/edit-btn-icon]]]] +(defn profile-bage [{:keys [name last-online] :as contact}] + [view st/profile-bage + [my-profile-icon {:account contact + :edit? false}] + [view st/profile-name-container + [text {:style st/profile-name-text} + name]] + (when-not (nil? last-online) + [view st/profile-status-container + [text {:style st/profile-status-text} + (online-text last-online)]])]) - [status-image-view {:account contact - :photo-path photo-path - :edit? false}] +(defn add-to-contacts [pending? chat-id] + [view + (if pending? + [touchable-highlight {:on-press #(dispatch [:add-pending-contact chat-id])} + [view st/add-to-contacts + [text {:style st/add-to-contacts-text + :font (when android? :medium) + :uppercase? (get-in platform-specific [:uppercase?])} + (label :t/add-to-contacts)]]] + [view st/in-contacts + [icon :ok_blue] + [view st/in-contacts-inner + [text {:style st/in-contacts-text + :font (when android? :medium) + :uppercase? (get-in platform-specific [:uppercase?])} + (label :t/in-contacts)]]])]) - [scroll-view (merge st/profile-properties-container {:keyboardShouldPersistTaps true - :bounces false}) +(defn profile-actions [whisper-identity chat-id] + [view st/profile-actions-container + [action-button (label :t/start-conversation) + :chats_blue + #(message-user whisper-identity)] + [action-separator] + [action-button (label :t/send-transaction) + :arrow_right_blue + #(dispatch [:open-chat-with-the-send-transaction chat-id])]]) - [view st/status-block - [view st/btns-container - [touchable-highlight {:onPress #(message-user whisper-identity)} - [view st/message-btn - [text {:style st/message-btn-text} (label :t/message)]]] - ;; TODO not implemented - #_[touchable-highlight {:onPress #(.log js/console "Not yet implemented")} - [view st/more-btn - [icon :more_vertical_blue st/more-btn-image]]]]] +(defn profile-info-item [label value options text-mode] + [view st/profile-setting-item + [view st/profile-setting-text-container + [text {:style st/profile-setting-title} + label] + [view st/profile-setting-spacing] + [text {:style st/profile-setting-text + :numberOfLines 1 + :ellipsizeMode text-mode} + value]] + (when options + [context-menu + [icon :options_gray] + options])]) - [view st/profile-property-with-top-spacing - [selectable-field {:label (label :t/phone-number) - :editable? false - :value (if (and phone (not (str/blank? phone))) - (format-phone-number phone) - (label :t/not-specified))}] - [view st/underline-container]] +(defn show-qr [contact qr-source] + #(dispatch [:navigate-to-modal :qr-code-view {:contact contact + :qr-source qr-source}])) - (when address - [view st/profile-property - [view st/profile-property-row - [view st/profile-property-field - [selectable-field {:label (label :t/address) - :editable? false - :value address - :on-press #(share address (label :t/address))}]] - [show-qr-button {:handler #(dispatch [:navigate-to-modal :qr-code-view {:contact contact - :qr-source :whisper-identity}])}]] - [view st/underline-container]]) +(defn profile-info-address-item [{:keys [address] :as contact}] + [profile-info-item + (label :t/address) + address + (into [] + (concat [{:value (show-qr contact :address) + :text (label :t/show-qr)}] + (share-options address))) + :middle]) - [view st/profile-property - [view st/profile-property-row - [view st/profile-property-field - [selectable-field {:label (label :t/public-key) - :editable? false - :value whisper-identity - :on-press #(share whisper-identity (label :t/public-key))}]] - [show-qr-button {:handler #(dispatch [:navigate-to-modal :qr-code-view {:contact contact - :qr-source :public-key}])}]]] +(defn profile-info-public-key-item [public-key contact] + [profile-info-item + (label :t/public-key) + public-key + (into [] + (concat [{:value (show-qr contact :public-key) + :text (label :t/show-qr)}] + (share-options public-key))) + :middle]) - [view st/underline-container]]]) +(defn info-item-separator [] + [separator st/info-item-separator]) + +(defn tag-view [tag] + [text {:style {:color color-blue} + :font :medium} + (str tag " ")]) + +(defn colorize-status-hashtags [status] + (for [[i status] (map-indexed vector (str/split status #" "))] + (if (.startsWith status "#") + ^{:key (str "item-" i)} + [tag-view status] + ^{:key (str "item-" i)} + (str status " ")))) + +(defn profile-info [{:keys [whisper-identity :whisper-identity + status :status + phone :phone] :as contact}] + [view + [profile-info-item (label :t/status) (colorize-status-hashtags status)] + [info-item-separator] + [profile-info-address-item contact] + [info-item-separator] + [profile-info-public-key-item whisper-identity contact] + [info-item-separator] + [profile-info-item (label :t/phone-number) phone]]) + +(defn my-profile-info [{:keys [public-key :public-key + status :status + phone :phone] :as contact}] + [view + [profile-info-item + (label :t/status) + (colorize-status-hashtags status) + [{:value #(dispatch [:open-edit-my-profile]) + :text (label :t/edit)}]] + [info-item-separator] + [profile-info-address-item contact] + [info-item-separator] + [profile-info-public-key-item public-key contact] + [info-item-separator] + [profile-info-item (label :t/phone-number) phone [{:value #(dispatch [:phone-number-change-requested]) + :text (label :t/edit)}]]]) (defview my-profile [] - [edit? [:get-in [:profile-edit :edit?]] - qr [:get-in [:profile-edit :qr-code]] - current-account [:get-current-account] - changed-account [:get :profile-edit]] - (let [{:keys [phone - address - public-key] - :as account} (if edit? - changed-account - current-account)] - [scroll-view {:style st/profile - :bounces false} + [current-account [:get-current-account]] + (let [shadows? (get-in platform-specific [:group-block-shadows?])] + [view st/profile [status-bar] - [toolbar {:account account - :edit? edit?}] + [my-profile-toolbar] + [view st/my-profile-form + [profile-bage current-account]] + (when shadows? + [bottom-shaddow]) + [view st/profile-info-container + (when shadows? + [top-shaddow]) + [view st/profile-actions-container + [action-button (label :t/share-qr) + :q_r_blue + (show-qr current-account :public-key)]] + [view st/form-separator] + [my-profile-info current-account] + (when shadows? + [bottom-shaddow])]])) - [status-image-view {:account account - :edit? edit?}] - - [scroll-view (merge st/my-profile-properties-container {:bounces false}) - [view st/profile-property - [selectable-field {:label (label :t/phone-number) - :editable? edit? - :value (if (and phone (not (str/blank? phone))) - (format-phone-number phone) - (label :t/not-specified)) - :on-press #(dispatch [:phone-number-change-requested])}] - [view st/underline-container]] - - [view st/profile-property - [view st/profile-property-row - [view st/profile-property-field - [selectable-field {:label (label :t/address) - :editable? edit? - :value address - :on-press #(share address (label :t/address))}]] - [show-qr-button {:handler #(dispatch [:navigate-to-modal :qr-code-view {:contact account - :qr-source :address}])}]] - [view st/underline-container]] - - [view st/profile-property - [view st/profile-property-row - [view st/profile-property-field - [selectable-field {:label (label :t/public-key) - :editable? edit? - :value public-key - :on-press #(share public-key (label :t/public-key))}]] - [show-qr-button {:handler #(dispatch [:navigate-to-modal :qr-code-view {:contact account - :qr-source :public-key}])}]]] - - [view st/underline-container]]])) +(defview profile [] + [{:keys [pending? + whisper-identity] + :as contact} [:contact] + chat-id [:get :current-chat-id]] + (let [shadows? (get-in platform-specific [:group-block-shadows?])] + [view st/profile + [status-bar] + [toolbar] + [scroll-view + [view st/profile-form + [profile-bage contact] + [add-to-contacts pending? chat-id]] + (when shadows? + [bottom-shaddow]) + [view st/profile-info-container + (when shadows? + [top-shaddow]) + [profile-actions whisper-identity chat-id] + [view st/form-separator] + [profile-info contact] + (when shadows? + [bottom-shaddow])]]])) \ No newline at end of file diff --git a/src/status_im/profile/styles.cljs b/src/status_im/profile/styles.cljs index befa265d27..14a5754e95 100644 --- a/src/status_im/profile/styles.cljs +++ b/src/status_im/profile/styles.cljs @@ -1,168 +1,182 @@ (ns status-im.profile.styles + (:require-macros [status-im.utils.styles :refer [defstyle]]) (:require [status-im.components.styles :refer [color-white - color-gray - color-black - color-blue - color-blue-transparent - text1-color - text1-disabled-color - text2-color - color-red - separator-color]] + color-gray4 + color-gray5 + color-light-gray + color-light-blue + color-light-blue-transparent + text1-color]] [status-im.utils.platform :as p])) +(defn ps-profile [item] + (get-in p/platform-specific [:component-styles :profile item])) + (def profile {:flex 1 - :background-color color-white + :background-color color-light-gray :flex-direction :column}) -(def back-btn-touchable - {:position :absolute}) +(def profile-form + {:background-color color-white + :padding-bottom 16}) -(def back-btn-container - {:width 46 - :height 56 - :align-items :center - :justify-content :center}) +(def my-profile-form + {:background-color color-white + :padding-bottom 24}) -(def back-btn-icon - {:width 8 - :height 14}) +(def edit-my-profile-form + {:background-color color-white + :flex 1}) -(def actions-btn-touchable - {:position :absolute - :right 0}) +(defstyle profile-info-container + {:background-color color-white + :ios {:margin-top 16} + :android {:margin-top 12}}) -(def actions-btn-container - {:width 56 - :height 56 - :align-items :center - :justify-content :center}) +(defstyle profile-actions-container + {:android {:padding-top 8 + :padding-bottom 8}}) -(def edit-btn-icon - {:width 4 - :height 16}) +(def profile-bage + (merge (ps-profile :profile-bage) + {:align-items :center})) -(defn ok-btn-icon [enabled?] - {:font-size 22 - :color (if enabled? color-black color-gray)}) +(def edit-profile-bage + {:flex-direction :row + :align-items :center + :padding-left 24 + :padding-top 25}) -(def user-photo-container - {:margin-top 22}) +(def profile-name-container + {:margin-top 12}) -(def username-wrapper - {:width 300 - :margin-top (if p/ios? -18 -22) - :margin-bottom -16}) +(defstyle edit-profile-name-container + {:flex 1 + :ios {:padding-left 32 + :padding-top 11} + :android {:padding-top 16 + :padding-left 16}}) -(defn username-input [edit? valid?] - {:font-size 18 - :text-align :center - :color (if edit? - (if valid? text1-color color-red) - text1-disabled-color)}) +(def edit-name-title + (merge (ps-profile :edit-name-title) + {:color color-gray4})) -(def status-block - {:flex-direction "column" - :align-items "center" - :justifyContent "center" - :margin-left 55 - :margin-right 55}) +(def edit-status-title + edit-name-title) -(defn status-view [height] - {:align-self "stretch" - :font-size 14 - :min-height height - :text-align "center" - :color text2-color}) +(def profile-name-text + (ps-profile :profile-name-text)) -(defn status-input [height] - (merge (status-view height) - {:margin-left (if p/ios? 21 16) - :margin-right 16 - :margin-top (if p/ios? 6 1)})) +(def profile-status-container + {:margin-top 4}) -(defn status-text [height] - (merge (status-view (- height (if p/ios? 5 10))) - {:margin-left 18 - :margin-right 18 - :margin-top 11 - :margin-bottom 0})) +(def profile-status-text + (merge (ps-profile :profile-status-text) + {:color color-gray4})) -(def btns-container - {:margin-top 0 - :flex-direction :row}) +(def profile-setting-item + (merge (ps-profile :profile-setting-item) + {:flex-direction :row + :align-items :center})) -(def message-btn - {:height 40 - :justify-content :center - :background-color color-blue - :padding-left 25 - :padding-right 25 - :border-radius 20}) +(def profile-setting-text-container + {:flex 1 + :padding-right 20}) -(def message-btn-text - {:margin-top -2.5 - :font-size 14 - :color color-white}) +(def profile-setting-title + (merge (ps-profile :profile-setting-title) + {:color color-gray4})) -(def more-btn - {:margin-left 10 - :width 40 - :height 40 - :align-items :center - :justify-content :center - :background-color color-blue-transparent - :padding 8 - :border-radius 20}) +(def profile-setting-text + (ps-profile :profile-setting-text)) -(def more-btn-image - {:width 4 - :height 16}) +(def profile-setting-spacing + (ps-profile :profile-setting-spacing)) -(def profile-properties-container - {:align-items :stretch - :flex-firection :column - :margin-top 16}) - -(def my-profile-properties-container - {:align-items :stretch - :flex-firection :column - :margin-top 32}) - -(def profile-property - {:margin-left 16}) - -(def profile-property-with-top-spacing - {:margin-top 32 - :margin-left 16}) - -(def profile-property-row - {:flex 1 - :flex-direction :row}) - -(def profile-property-field - {:margin-right 96 - :flex 1}) - -(def report-user-text - {:font-size 14 - :line-height 21 - :color text2-color - ;; IOS: - :letter-spacing 0.5}) - -(def qr-code - {:width 250 - :height 250 - :background-color "white" +(def add-to-contacts + {:margin-top 24 + :margin-left 16 + :margin-right 16 + :background-color color-light-blue :border-radius 4 - :align-items :center - :padding-top 15 - :elevation 4}) + :height 52 + :align-items :center + :justify-content :center}) + +(def in-contacts + (merge add-to-contacts + {:flex-direction :row + :padding-right 40 + :padding-left 16 + :justify-content :flex-start + :background-color color-light-blue-transparent})) + +(def in-contacts-inner + {:align-items :center + :flex 1}) + +(def add-to-contacts-text + (merge (ps-profile :add-to-contacts-text) + {:color color-white})) + +(def in-contacts-text + (merge add-to-contacts-text + {:color color-light-blue})) + +(def info-item-separator + {:margin-left 16}) + +(def form-separator + (merge (ps-profile :form-separator) + {:height 1 + :background-color color-gray5 + :opacity 0.5})) + +(def profile-name-wrapper + {:padding-top 0 + :margin-top 0 + :margin-bottom 0 + :height 42 + :padding-bottom 0}) + +(defstyle profile-status-wrapper + {:padding-top 0 + :margin-bottom 0 + :height 85 + :padding-bottom 1 + :ios {:margin-top 3} + :android {:margin-top 1}}) + +(def edit-line-color + (if p/ios? + (str color-gray5 "80") + color-gray5)) + +(def profile-focus-line-color + color-light-blue) + +(def profile-focus-line-height + (get-in p/platform-specific [:component-styles :text-field-focus-line-height])) + +(defstyle profile-name-input + {:color text1-color + :ios {:font-size 17 + :padding-bottom 0 + :line-height 17 + :letter-spacing -0.2} + :android {:font-size 16 + :line-height 16 + :padding-top 5 + :height 30 + :padding-bottom 0}}) + +(defstyle profile-status-input + {:height 82 + :line-height 24;;TODO doesnt' work for multiline because bug in the RN + :android {:padding-top 0}}) + +(def edit-profile-status + {:padding-left 16 + :padding-top 35}) -(def underline-container - {:background-color separator-color - :margin-bottom 18 - :height 1 - :align-items :center}) diff --git a/src/status_im/translations/en.cljs b/src/status_im/translations/en.cljs index d870ead6b0..8e5b1e8c20 100644 --- a/src/status_im/translations/en.cljs +++ b/src/status_im/translations/en.cljs @@ -68,6 +68,7 @@ ;profile :profile "Profile" + :edit-profile "Edit profile" :report-user "REPORT USER" :message "Message" :username "Username" @@ -77,6 +78,10 @@ :email "Email" :profile-no-status "No status" :add-to-contacts "Add to contacts" + :in-contacts "In contacts" + :start-conversation "Start conversation" + :send-transaction "Send transaction" + :share-qr "Share QR" :error-incorrect-name "Please select another name" :error-incorrect-email "Incorrect e-mail" diff --git a/src/status_im/utils/datetime.cljs b/src/status_im/utils/datetime.cljs index 5e96371d37..a7adffdbbc 100644 --- a/src/status_im/utils/datetime.cljs +++ b/src/status_im/utils/datetime.cljs @@ -1,5 +1,5 @@ (ns status-im.utils.datetime - (:require [cljs-time.core :as t :refer [date-time now plus days hours before?]] + (:require [cljs-time.core :as t :refer [date-time plus days hours before?]] [cljs-time.coerce :refer [from-long to-long from-date]] [cljs-time.format :refer [formatters formatter @@ -8,6 +8,9 @@ [goog.string :as gstring] goog.string.format)) +(defn now [] + (t/now)) + (def hour (* 1000 60 60)) (def day (* hour 24)) (def week (* 7 day))