From b5b5a7282691d27ea121aadc08b89369f3c8d566 Mon Sep 17 00:00:00 2001 From: Nityananda Zbil Date: Sun, 11 Feb 2024 16:00:35 +0100 Subject: [PATCH] `Development`: Release 9.0.0 (#44) * Add Muted * Copy logo https://github.com/ls1intum/artemis-ios/tree/31dfdf8d514dfc1e708b68d45d2d30bb180753e9/ArtemisKit/Sources/ArtemisKit/Resources/Assets.xcassets/Artemis-Logo.imageset * Rename instituiton: institution --- README.md | 2 +- .../Artemis-Logo.imageset/Contents.json | 22 +++ .../android-chrome-512x512.png | Bin 0 -> 17702 bytes .../Artemis-Logo.imageset/favicon.svg | 10 ++ .../Resources/Media.xcassets/Contents.json | 6 + .../Resources/en.lproj/Localizable.strings | 21 +-- .../Services/LoginService/LoginService.swift | 1 - .../LoginService/LoginServiceImpl.swift | 5 +- Sources/Login/ViewModels/LoginViewModel.swift | 12 +- .../Views/InstitutionSelectionView.swift | 151 +++++++++--------- Sources/Login/Views/LoginView.swift | 89 ++++++----- .../Conversation/BaseConversation.swift | 1 + .../SharedModels/Conversation/Channel.swift | 1 + .../SharedModels/Conversation/GroupChat.swift | 1 + .../Conversation/OneToOneChat.swift | 1 + .../Conversation/UnknownConversation.swift | 1 + 16 files changed, 190 insertions(+), 134 deletions(-) create mode 100644 Sources/Login/Resources/Media.xcassets/Artemis-Logo.imageset/Contents.json create mode 100644 Sources/Login/Resources/Media.xcassets/Artemis-Logo.imageset/android-chrome-512x512.png create mode 100644 Sources/Login/Resources/Media.xcassets/Artemis-Logo.imageset/favicon.svg create mode 100644 Sources/Login/Resources/Media.xcassets/Contents.json diff --git a/README.md b/README.md index 9e0adc1..ca1b0ca 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ In Project Settings, on the tab "Package Dependencies", click "+" and add tJlr_`HI*AOGEu})XibPa|v5hTD zg~HewThwHbF!ujBeLtV??{`1=KfdpJz-!LyT(09hmiO^KjuB&JVZ4(^lm~*Kou($( z(+~s)zrrCd4)EhoVD}pMA$7szv^fL??S&v>Bm}WOBF;b%{vZVXbb}zR#}Fjqn?|-i z1_n6Jn;B!FZPx$H>f8t56K-D;n^#eT>SAa z_{cKI);{3$If9h0zt6=h*F2;GZu)viUGWXL06~Fi6Kx0NO~0Rp5Hh^V7kC9_1kD}@ zAq1tc#G?)F2$}b`QlI*|TN*z%iZ^n8BAR5LREFdqA}16uUXl=G_`(!xU>i6vJ4|rH zEe$s>bgZNW3kvApiKXS;l|G!rj~&+^LSU4Aeb_}3Xx?5i-AYMfC57=f;-`Py#_PjN zad%5g9Tg8Z!rrWvcjmM0k#5zQUf(cqwBEC4Wn^woMz5=q>`INL?CRF<%9S((KkEOT zf7Vrb$+q2(9PIcLcQ$JgN!NB%k{JisC3Jj$N1zLwNb)P?kW_5eyEaYsnrJ83uWvI! z>h>%A)(k(GzL24qRUm?>oY=<9}TqK8fvbW{0eI z>?rs4w(ICkEnB}8D{;TIF@WxZY137PNar(ca*mv3t9Dv^3$HkDGPNO1{en$C>kRQ5 z4dq?k?z3dGD;={Lid@@I_r|m-gBcjc-GGS$(5ly}ID4G@n>6)yaysdqvDOwpR>-!Y z=vjEcz~XjayJdKA`ZQzvd-cAfj*^@x4+#R8>Ny@>{rFVyRsr%@qi#C7wth{6B(Keq zXP$^%0a<`Ti#v9Q6qZ{uzMxBOK8}6DIy@UXeDH|&dd*1kt>~XWuPhc)n+^XN3H{Uh zG!^FlJwi8P@vg#EV|z(Kl!q{o1xU*>f*j@r`ESqUqo+HEGKu`t1b2|QJYP%=w>vOO)95d z;??##wca1nFyfu$O&(d(h><_SIy=cjrKna^f3!e1W_(~g)_CQe?itKa4VJ9jekobb zeqRqd`ys=aEnO<6vLHT%q!kCQKEVcebGvJ28LUrQ-IBD>w5v3yFg}%}b%!;kJw6yN z4x^=s>v?%@Fg4#Sy%n@xXX(*-9PVd<_vISSiftEV$BL`DW(DyXq=9%ai9a}GGhz|a z=^L*wn*3n!Fn*C1ar1uCSN^CGbB?#e0S3e7Hb~h(B zxBHnJ+5qd-09I?cx799*#PvKV)UK&FFduE@{atv3l(z(g#FH2`SJidJ+;DN2Yvg{_ z+Kn64iiI-&j`?iQl$vGAmooYUU@s+oXE#QuXl%C@(88$3QoZ0Tg5iS|9eSKsUsgr` z`(sLpqyZx9jjeE(#(rDY>~yDm~5ewqeF#C$H8f(Y;g?Nc}Ka-V23hyQ=_jXtDE4eE(@}bJ020d z{lW6WdqOGRSa>RCZj?1Em8D}){!{y{j-FA@&VI7oCkyd2ntHY=s(WJD1=gueUC2ThgPD(?$HWV~_v{-D4s75!Sb z<=a{7X6Lu(s1%Tqls8nRz1V#_Q?&?rcn)i4U`Xzh1wSuws;LIsIS_XHhidGnb7hx< zcW)u)@3pIP4Nv9LawvN&AnsyoO^5|^#94D_k5e-=23D4^^f)R0uTOGb3x5oj#=5gq zQQV0ffSb1LJvw}D7_~dLn%-NGaWUOMNFAu~RG(a}W5C;d-0|o2OzO>V^V) z#(=1!FY0dmeD>wab|n=J>oyW>pQWO(e)YhX;_~v>^}>VKwIFSWGPdpt!`ybgPOS)e zWuOjqti_Y2Xqm0>DL!|~nEa+u!7F3Z>W9oF4`oJ4s}Th+PJ6}k^QC6#vV zZg$D@u)cok9;_eB>XG7`)%z?@)9mSS2j_7Nt-p~?o0QG+O9z5~m#z>t0%kwXIT0eG zxPsKlTXn{3?HFq710 z@}svK?#iJ&P(arlvh#0RDsAa%hJd+MN}RQZxmnU5kt+OW zlF4;I;?^vQbC`#@S=TPz|ItcCqmudUZ2ld%ljpg0UGdBph^5)FSii~6wgG=SGCPmu z5)AhaElpcLE6Q~sV4vjVF|=t;~ zrr@~`rxeJzAMXRB5MB(*E56FpX#l!Zz#7W6@je@PYM@uJKzsa@G+}4;cfKkH+*%vF zKsU0es_f--WyYJ@Ci3m#$_L(LDwuYUHBAQh@Ke})+1*fL?@PWr^jJlS;ZI=f8fz?v zGb5;Sbm0CEdZG4=9uHfLc7Y73o)y{Dta=)6*Sh+tLL(Wv`a&Aj&;3WvvChxB05NCV z#olihJ1Seqw`)vsrze^_{0g;6^$}p=nbSQRa@)>}p%6D+cp!UR{e}{4{9fKe)^;x@ zYPY)sqa?hB4F;vkUzCr3WdKb-$I^7gZl&O|=KKz^noD4?$4s?u{V;zi97u97E8l0&CvR>6cqUz5|OL9~hY*7I7CJT7(?BGHf7Z%bM8~ zE$KO?xLx*Lcz#_r8C#rTSN`)P(4)+8KDF$^@|n8ac3jVGu%S#qQ0pYSwv!z{JIj8Y z=3CzTEIXEx#|EkB?sLPT&8g?WX|Q0;(EIs&FSa|~R3-X2lvy>$xQ!R@$G-pqH30GW zYj4POxXVDeVGiLTp3~#rg!WUoZGj;vA`%GnOP*()q)6ydG>GH89^KM%yYRV=#{BHu zV8c|+VCs?RTpgW$^6hu$&-`d~RQ^SBWGTdWde7_1+T|^gBarWFjR>JWnX|+ztnKQ6 zu-$jPg5c1xjTFMlYVXtgy$%E`>aL);5l`>}Y|fC? zuUDS_7iSe8VrIOCk85W7-}u@+U|4X3R8T>MVX4$v)t3QN(O2gX2|(Cs{Ki&Q|KsNp zcQGKVf>)l?xvpE2>(K8)CwYReI+Hozkux!T8ExPm#S6vC;qc1aU$3XU`ng3_ayMq{0uX2U zJwxgp(5I$vw=JuOR~AdnA5zio%6v%1ySV=h#N~hAp5#+}!`azIj)IRp&whmuk>qMZ ziarX8bsQbq4;NobmsYQmSYNZ zx1tg3)z(_3r&G7GWI{*sNcbJh`SWuiy+E7f&pPD&OD>ys8R22?7#v_!-iU9sIRJPM zXAo1)8{mdh!>VUaLZLt+<+gsS32m!}tckb4#Hjv7S21SOo$tWO2?cr|-vq$US{Ynz zVs1Wrts}F&3^xC+sN^h~DMH%3Blg+^eJWqF6>~^S$M-*twhhYC`zt|PO@|Gdh zCJd6zcM`6DTt;zAJ4fF#GCThR>`~Z$;0TP8^7r~YdB5QgRXUbgk+|Dc@(a-C(hZV# zf+b}`=hV$&d%aJ&o*OpEnkHe`$ITfP-8C zvnJEhgOQ)w2Nys4f>fOIy?zX%QxVjeR=%tb2xvo;NRVPu8C@w7n0fGa8--8ESId}e3 zyCd5@`=LNRLYqVrb3At7E4bDtK!uFzch)){&CY7A>?7YkKUVV<$14Z|4H|^PsAu^% z!u?yDN7)lfytC|gmjo?2Dy!}P12*f_o?u+E_!F|dn~sd-LsfWLO-<+k->3zABTwmz zx$qC`ZSmCKLEFh!bsmJR?FE+;2ZGFTGu-f13Fm-U`O9VAS-S<&oozLJ5`eP`2A7(( zM0rp&w_T)qzv_~%JGK*N?y`MX z?g2FXi5xW}CM1$#+m7~5H|TZ*S9f`6v+wn7U8mlFC@}GiMm1Ta-J$Xf;R90Ib0<)- zqg(48KCXz&_h6KIt#4*_^T!?46(<6J=^cAc{?ZesMqW?g9TD3X_h$y->5;+vkjC3* zD-~#xvPmmdc)_n9d^w2`Mfq*kQtZfZp1iHf8%;$DpE|>P-#}8t;Eep=(~9h(+qX{B zb`|c|k)&_|U#_Hixi)>iYro9b*G{=#wrtH{bK-QhY_BmNTcOK{H>rcAnXL}6%y>NS z*WUDF{(K>qHl)hig~OA>xXKY&_jLTeuaCg4@WNt;8U)yMH_GkX+s*mvE>0gWCW7)t zf9(YQOm^WI5@M$&w2?!dd+cEIT6Ce^H@P{Fw2Q`GFmo(b_JR-9VSeAitAFkF18aT4 zeTGNtv740D%Z3H4lBmdVs0C4_T~HbGAyOL>GBH&Ajvmv0_KqR7RyIsfXsk|obiT;t z?7%{QP^5`}*3uz3W1}h$)HEAQ?o*BLKs~=sP=16THs{4EW8|{53_dG^bxm}c+bdW4&)N-hSc8*g$4;tj{j&g z62McNPb~nD^+e28b)SlZ>-=FN2oFM*GHbJ>CnAqBuNt(gWsbmy3^3m=hyD_B4dEt! zmOCSICZZwZ-aQ>R^&#~ufy&W(&@W!5or9!y6F7HEcjr}!A5+gCD8c|P&SGj_?{+C) zetxTENNjV^-RskpTdxahkwTV3Few{vt()2!8~dA`jeWZ!>&hAK?}6aY!hG&5^+t@} z)rQ<(ULF_{SV$MCi;|zRn%-bz9IM^U$v4!m#SVo~B$boO`m`d)qxAw?NwE{!s@yr?K4NuVrg`=6aA@QZIM zGUwvn4m(eWehtW8JoDtn9^k#ZAnf&T`eHVX{^T$Do_9!_bJHGb5 zHFYOo)_NoMUScQeg0q_&@91YQdu9`9aq|uS-ZT zXY1fG2CrH6(G8fJh*W3}p3R7*$gfZCQ|aryUTp_WI+aEO0-N!ySCvb-#`%Icte6D1kGO;9zVOz#4w(esVVPC(RTDi$~t+ ziwWew-LWgkS?$e1lXzj%-|M8qAk}M&WyPMQCAu(T_qE~UU*9%cr2CCFo({P>t#Q`u zq$|6C5hm$_a@OTBGbnl2(pBnNZe(~{W_ESuM9MCi3u+rM{bkM#Q|c}u9U#(sVz#S+ z9naN@*ot%TyhaUQo2vaj^&7RAH7*k#^$-UwvAXY(Su>Z9VEc7@#mTbeeR*dJ28f+id z%KDykddE;GCs;*vU((}CXoE43)p|5$=4;+;U5l84)&PhOT$=4-UvbeAuMQTn&t>a( zB5IppMS%hiF$EwGtiSmfOK*@G#oKYr{^Y~R?b$(*c>tZQm_YJc*XFw`DrFlTxQW3Z zx|JtR{EAE6yW>RtRQ&TZj)VSXl=uQe`6{5v=tun17T^Z8NzjA1+35Tu(Z0+wb3009 zlU79i{ZYSe>4ulx57**qAmzQU?kByu{o~S(y2oRcj=7N!`Is_BzqihzkB>D<4s^p5 zYI63^kD^MyBBM+<=HCHJ)BXrc6U9xb_;)LB)S1toIc*(`BmxL1?|ftMEx%sIVS$GA z7ikv+MX}WC_0F|3>fO$#W6_o0opQ0Q>%__oQb8Fq z%NGQm(z~O3)PY|cpk;2}s1HATD561c@doF&UX~1iIS*W$FKJ#jVKV3t4{*rh7W)Sg zqq<)F&e3}Q@1DbaIb&NYfgMT!rBO3uG7bPKC~mADt(~*j{dp|oEIW}9jc1GEt(AFY z9{Z9ifr+?83D+(`|2M#`+2=NrB=#nSd?ZKI-_nM~b_g$fa{0%(bOA$0c%X=*ot4JCx~Att z1hBqyITMBa20nCQo;T9LH;li?y_oqb*P$iXt_uTU>D@=I$cX!3ONIM!u1#Z>gZ}Q; zKF0#5xRBw&)x>r}R!~eNbVZ*zWud`8+n+I!x#1L9!mqix<+^;3m?! zyhZhPr=Xk1B>k0XXPk_!iszl4)?^2I4hNFjLFNz~b(6b#yqw>Sq#&4SG}yEnmW1jcJ4CMotkgZ5SMC8EC?8HLnqq(UjU-+Y;j^ z_epfwsp!>6hD($9*f$a}H&yJT6VPD|&Cg=z%yw#QTxdmIshJ(ZAh($)RwSyOyKryx z&mlXIi0KkhAmJQe3=1Wv`)?GV-S$Ku-`fVw9iVf)Yv^&kx08I{BE{XMj^}U6)LuRN zI=uefQ$IypRmu4<9%6%3nC|79hO{6$f13^iYP3IGL>r{d$LG|p$9#Y1p*nE}B9e~6 z8JfhAYv>c2Wnu|6BU%yHd^x3F-m#_5PB7PES%jz+a=(O3XiDCqrC%`R$k)p@>Q({@DFb?hsKcl zpYKWPHRGkK6zxL_L>}4<90nl>gaQhhyG4MG$aMAtHeX5n2ns!i7C$o5_ri924jc66 z#^NwrGfk=&rc0+6)z2zW_psAeKy|4ivx!JZ#IsK!UE!oe>6G3j-$lF}G%~9C6YCPC z7VnUxwVHtrmB*PwBYe=Q65RuBWJ^a2UX~yHHG$N>r;%R5BffP=s)HOS@hAoWGE9=N z=_&YgIMGoO?SWH~3Vi@xlLNfwd3&Q_eMz#=v1-KuHa`3ub*d`&HL{~^a|G8l4GZMg zf3}o$ntBw$;72(Czuw<87}gY-yLA9HHXna**Jl?;oe%JYg3U+DNz50Xi|fQ=J2ESm z4%wWMh0RGo7eH*PEJyGo3>B|_LK{_%aGl6X5U!hS>X}-Z{>hCK<19_vTb{dAXG2Ys zN}`GB%iQB7lKu}Io4kuooA@L5{*%b$S`4mKoz@F;^xQPcyw=%!tI-N|1)zXmv{Xn& zxq|Gbps|tj(-6O5E!-dpVcmDp#5pplYrF>iQtPm-htyrk01c3evwDwx`((P$?r#eD zM2_<5OPu<})q)2j@4fp27IqhLK+#5jx)I*tsMQoa7pppmIaO6PNEwqf_>FxwEg=xe zlIM7g>>E!_^Ug9x*1ey|K#&!JY9WH(+NkUMBhp+Im-26n5ivtcY|Z(@%&oCoA!pC1 zhVl?y5%Pd7y0-w;+RFO80;>yKBJRmA$gv~0<*lJ3!ntj)3k*LP$u5vQyHLa-%oc1nhLJ%ufVxt(er7j7d}!@{59**uUyB<}wk7GrZZEILp*{_DN~z zY@t)$uu!KprnS~F+N#;t9&3PmXyfd^L52Cg7pYPsLcD~H$HZA>+e$28slP!Oi!!rXf;i$zmuk!Xy<_F*#TXs}by@^gO z@`3uklA|1_WF&W29>BGqqn^kgV4n};b-M@drEQux==v9kQ(05WSJy(p%1!=uhmsm< zL$U5?S{#Cs{=j#J`?=4%xJ)YWa-`%_Vb{X(!!IBKs#1xULZCuo?~iUHf<*O4vK)_X z^($gKJp2kb`6zAI-O1YX=;MRUJ}>#LdkZrGX%uKJ@HN&wZhGIA z;uzg{KmP{2$`yL-1~&X-^l2Dw=Mdfb2q*|mV0;9I+|G2&k3eW{c#&F8P;?NT+J#P+ z@7{o_QVV4+(}8}t87g{4Yf|(mQI0gO`RJWDx0t&K_noc|A3tV(kP<@Cvyz=NqVuoq z4SUb_D3&Q_x^{}+=mrlAio%4Dp^#QH7C|Tpskx zr_k{7pe=q5th@pkhwVT<-xWa=qmzxRECq4-w(t-D&QhyGBAQPd^u)1~XemE_qMlP( zXE;dK?Z7qIfj4*KunfKyA30Zp%>eb~sD=4tc!MHO8JSNq&>pCAt zS}k$=>}T#ji5Bk`(x&tG9R-NC`PEAmxUU}ZIo|B^{>&U~Qg|s+ngOvH;~pYRKoI_J zdob8RjoaztbqgQUqv>3-2OrB{s1 z`YdRwn>7%~MQi6Qj>cPtuu^+IN=KpDcwDU)2Zc!geq*+Kra%Z}1dnz*&GEK7pE>Jt z6-4M4`IYdk5dFJ_PUnAJpvsgW5xd&2nENkp+&HvJDZ``=c6@KtAVDhtT!iEK)+XYVJ zC)nSooQW@lB5RkvhUckCB3oo2vQt^(-5MU*SgfqqSpoGS*um4TwOb0l%xOna%!5Z~ zQY@$DbBhE`mDz@F!{+6((vmh|;n{d2ad2cxW?OUc-qM?LL^P0-d!fFiYnoQ#+{R0< z(>)_ZJ6>Y%R7-k?lLha_XDwNaa)g`InEEIWa@%>0-}i(c)8;CvMS+6eNz9Gf zXZs|DqIbxw%hq0^+#1(mf8K$zZy7{LARTp##-d%}Es4tBYofl)OHMLu(;)LzBTee? zm3t816tn8Xu<%$sRvZLEPGtFwu(|IS!`X?T=M3}fy7lxVK(No=f~9SGo)K4e6Ai(J z*OX{T{zSkjWZ%<eKuI!{kS z#~Kgs)JSW{IPe!zK+ZhG-nSjcIDJp23Ogq66hGx)d$^S0tk3s>LBaso`t8EkD|aR2 zM}hlX*qg*Wlz9PGQ0g6%c^jGwpp){(+Z4<=&K}A&J6z<(P6SW`^HI=bYP`EIxX_TK zmOG#!#21rlCRl~C`s zX|5O0C?jx}5m|O$2A!O5;@ChW!Au^ZNS4W}G92jq*tJ(myh7`=}9vH zQ{bj;!{S?eSU>`3-)@qL4o!lSW(U?i4V;vdF?J^bI$Utsad>Q;o>8EUF`QTLtt&TL zNe=f+Ki(~zn!cB*Gk?kJ&dfQCsmq*G!Bj|creGC*^pq;G`%rL+y;A0mq+NZ=@`X^UnV+Tw}f+9+PG~Xpa zsicrG3gt=a>^mkpEL!S%K4Wh9Jv1Ia}fR z!O=gaBaz#2j+`wT$naPowkf4t?i%-D0e`?anAGZbL;wfp7;n7Gd{>bxa+H67_-YqJ$jmBvW{43Dqea*n)}`sI~C|{AdMq;{$_RWDgfJ1xDL67y#7K?9o3@je|6QO!Ba( zj^i&)amp?L&h~<72HE+cxBkHO0VNpunZ7m~_|4YgiuuVLbVK=@;h z`Mozm9x-o6f0Xb87T8rNQ%?dbTR9)9-97KhMgxMlLqi*Td^UUaw#XrupZy67RAeAD zfMR2hQ4~?F;r&{&r^*qX%3;94do9G5%%%7-1-&vz*Vu-Rz^Xyh3D%in?qD3bQv~v| z1rW1K2`c0r3)H#%NhOQ z$Q2!~cung|(bL>j6h7Hx{7}!!2G}JD;@N^=xVI#w2=dLvo9y=G%zPNDaFrm~!~>-l zI>FyqW0mclb(YJ36s@!KgUdknnSnQ>6tc5Wdm`SXb3q3xl+|UxqqmnsUdHBVY{VS4 z#E!rOIAP59;6dQ3oPZR8HWpg_lcDrpbs9O{ta%u2Up}HGO9~XFsR^llA|yA2 zn;j!rI5>um^8vp$ZXvrG={X@y)Rv@3P<3GM0oQ_r=5`eW>GZ`)Kg6$>=NG|S%DlNB zFXab){Pt9k4q7&5%<{>KtgQU}u)x8cN+O(VK=PgQI*`*?{s;n)-s>$3QwNdZ*)&ul zAMBD4ksV0J1_~tD8?&JZ&F>#djyZPyUWH))A21}C4Z&JtLw5w+r zj=mLeKrh25Ma+lA;#`xoDn`KCj+TvuFkda=eX3F&i)zWj8zs!k5x@MCs3^jI0oMbi zde1x%4L%~Zp%fwi+%}buWAf1av?vq;FW)o*l@k+wUrx6p7B%5VnC5Wkiu_(B(}#Az zI-*idemhWfc2M+y#$}2m)U;}0G z^bz>4JW@e1@-5I9VIGjFY;zKi#5QEe2eJ5!IF5rIF=Vt*rKc+3tJf#tD3G>as-+lWQKq?1g`@5TF&_8L43rFWDxv5ifQHQWG zI;S(n%bKzi=cADMo`2AlZAn$iS{C!R`pM~2+YRCS9bBz$1@di666Qucb^u{lm89(r z6eV)dg>#B1`jpywa{V7gH?-T88P)hd{@+?3LS%=s-Iq1L6jil>m;05chUU^(gaF() zR7{>Kp;#6g9%u~Wq?qsXF+LU@o}=IKeSRM%v8oo~y(iNz#4ZF>Th5`+$$ij<{^3$c zOr;225xj+q^O5g+z*%{axLNMNc=&FQ;iL-^w4H*jt{2fsSN+7oTqVlqx*O-2qsu*d zq=pPqjRgy4T!2_GBd&s&`Yx`RzYN9&$%DqImvB(=pX?jm#9r?Qe5BvdcbV)n{D~l2 z66;JYbn^e@+w*5X6;&ZznF9Uqf@15QrW|&QhW-wmCFw_HXiQ$AZC47!L=hvw9#x3) z^}8n5yq^hGqKOLYi!<(b;WkW^6wkM2)aZN0sP(2EIdJ7EoFv35&$esHI$^@Y zE*U&n*U^{J-oPCUzOvNEqn}+Rx-XlEGTk^{x*Do4apLIQt9QUjNl-u)_MO}}ZRo`V zkze$R5k*$Z)jKJrh}OHWKh2dPrL&m;cy#+ebrUKodiQo}Tz}3!+THN^D1uh$qMEI_ z(OcIHfCuK?-lXlemzCUY82Y0FGihSm{9l&;r=Krt(1q1zCc(Xep z$ns6>(}sU746(77Rxk?tdB?jy-d--(Fe*lP6nY+H|e5`uU?Jjmsdphly1{Stq*hl6n9= zFAUboRH3tV-wg)S>*LQYF1YM2*R1P+oH~)tpv?a#+ zMuB!Hj8!rRtWI#$*3RqPehh42bZvgyeKVU2bIzV;!PADAn2LP!99XU}MVYEITa2LL zVCA2+o>w2QMjX6$^6aa*8D6e2vpxBJT*e))Anc0Mg)tb#e6o7NGrksm`lB23u<%F| z7kQsZA#&ZS+^*5DwkGjoM^M}HtXHTsFB>oy-$A|fSix;zP^Fwn8} z?W7n)$RurK;7zVZF^*Cq=h}}4-l^S}&}x?749LbvlKd%bl4ZV{1Sqng;?Sdj5#B|q zph_3+%10B&V=Fij?XJhaRU;FQJbM1I9T+x-M-ex?Yn~1%z4g9guFT?JvdR~%14j^6 zxGDWK(Z~zT@JR%qI|Nbqdo02u2Rcy9dXo0sR#oV|s!$?i^=}Ebq#m%1{to#Yax5j6 zXQd0;NXjNvX)yN%Q6x46RzE*@6q#1#7JWai>^NI>q0%cc+LA_Ko-x%|$$G^PH2@F-xIw(;(utNubI&D1Uj6YYoc! zYe962%tb&3+=XdXh1Z=O*c*Y`+&4id6V4?fzsnuBjX)BRc|_dvSp zjV$27teszZ`cP6iX%PKUp^$`P(vC@S-d{)xtJ9ri<2C$tmn7--SMe<@_5%xlNFd#w z;Xj?ReeEfwLKf*`r~F*Q+dwD*=i+|dU=6-${OqNVA?1!9 zQIbF(@i+h?lC>|W7y}B`n%yf73N?fyN1KoXB>bf>aq~j+_f9O-5 zaAu}}Zvq{qJtR%4lp$BkD6_XQV+cz_aNe(uJ7;jGGlYkVTJQ~qt&fWJo+2Q87WMjYJ0{gVoytdCw3{qVQQ zIShAmrDR+~!`R$8|5NL<28b6)}|jAuHB#6Vx|vFZD)}NQW&|Ll3D9pXvKOe(WkB zs+>JmOSu}6MEyD9!n|GGucl#F(T*`otk79ZOa`RIL7XZKs)Ud1SS*UdQ;M%Fo>;5d z_)^@2IEXjR-{7RW@?ro8?D?3*LjQ~t+`2SL`J|QXo?c2Ir+(AQ3yvEN;ngY{PXOAG zcftNnfiX<D;IMPgj*{Ij~rFL#!^8 zW(`TGpVZ)*-}@L{+at*LKSkm1TX|DBzsbnIxc?_Jh9tjRZMd*w9Y&1du-w*Vfu1y1 za^E#hsV8>xUb}aM!?xJGbODD%B0>7tZ&^BqoxKE zVWAoJ(^ZY&Q~u{+KDW7WvpE)9_wuQ(Bn1Ke_GgytBx+k>{nzfkYQ358rszoG#8^>8 zzuD{NGf)z}2aQ5SMVgF@heL`l`ERA;ar`0wm$>c}=eb!!tfzki}$Q26P%U zeGtM|+&qEi2%Mh&#q?jo{!h2!6fM)m`$pBFPnXjFxV(vrCy}yE0qOV}=Ieoc#+U#+ zL9hFIjDJ~Ar|Ij2+hcq!f;XQ9gY*f7@`xY>Vq#uHuOQl`)gL!t-_*ZPmisTrHYoh$ zSnGTNCH03$>{>NFA3FC*MCV|Yrbx397Q2xBRCgChw1wOku7Iqim{gVcnC z_gLA~23Np1g5t1(2>41Qc0o2N(7yBs0+^)R^Z^}nK)7lcI&Wc3fsxU}F9Cuq7Q?G*p4hn@0IOH>NXozDBGBJcX|@u!D6 z+!r-SB!KsE1h%SXNIdDqrNCV#LU&EhxKP`Fra}*v(qBqBHMq{l(Z}6@;bY!OVKQJ0 zYbY%B#ic&U`S&+&XBW&uJF34Yx>#sc2j^$ZY__0_z5=*JJ@ zsgC-FB95W3RAI3v4@=R|zVxbH{kymR(}LbKqBRR0eSl0qUI51u>{Lq)uy#l3(`2`Yn~_c zkIivE_cvYY3x5CA42w5Xk6uQyc*+3?y!hPNMIvv>(&<6zj9^$<=nxQvw z=G9#rmfsc%!Q9-2h7yT2kLsdzj;n^AKcRhO)y?DKbso_YnyNcvIVJK;z3R)I(|4Cr+Jq83CD)B8t^WlQJZ6K8)$=}1etI{NRX}x=b zS^zuj`El*=lD;A6QyTWG?u7-k>-UU0b4~~k+iYEVxd!g$fIIVOU8xd*cOx%{FZnGR zYF?T;cz8hGl^x+*>3N<*i_g$zrJ2$@hpeGJ&fVp|0++(hSndaD`B}P1A?;6 zUo4Szp|^Db7C!k>UF?Hvvj_yfcnn%17a`;fB_|M5?&*hL-9$5_F&LhMJs;~>9<5Ak z{$K};QHRN%4J9IL*{p2!HsAr*m_-P8ah3@*-C`9ll@OCJkjG8|ZsluMTwKWS|6x|T z+M}7BoNXyD+O&TgNr8pYxLJ5$E&IWj>3j>iG{!y*eQ>cAJphxx?C*ViJ$l>U&iW(p zzF0q53>_kf6PFppIpp&qua(8J6+yHAHdB^ObY%oAYNvl-A&8Qd)fga#<2|W7GY3jG zMHV?IXnD-shb7IyY6Puf{s{4j$@}}S5GVlk{x3j-+BiTiNO}j8` zgBs@cPi6v_s;G{~^)#!0r$@5tm#K?IyTP2slCh(8pe+?(>#~){g`+UvVTa32^U<_A z2_5pI>i`U*JWhbHp9}9RPUriAsCrTu^qCrB-K=`js@y~C{GmZDbk=_vMOSe!L*AyR+Q~w2$VW_aNi;!TAn|)) zXyXl6xJiL>LF0$$?MwL@fXo5!zy7y|d64Mk%rxeJZ%qw`q3YY!ax+jFPzMuI1!*A)=tin`)S$M@4G?6WB@a@B~qJPSlK!5x# zv7)dQaebeWwrJ4tmRh#9>a>10YgcK5I8Cyz9%I1HCz3rj^tXH&4g;1sZlM~A0!V^M zzeK;us!fIW_v&3z)P@w46Y3vDZ~uBRENl)M-GSC~fMzKeXqLKLwE2*?yvJ!HO=hF=cN1WNJ89IzJv5zn%vQ_FitL zgyAsQ0=&)WZCNWo@29bbp&eGwTShP^n#3>FMa-7w+z(>XXy^ge+pHt zL#I3e1SV>`b-~B3YD28juTq06Q4jXRkmb`z^~Nkf@dGUlKiLk zTe8uw^0ZR@RLBd@;}4c#;4ed1H|M?VK+H=KWohw3t-k0QYkN9$FXtJ-`p>@WI1}lnxzII;?7Y=%CgS4XwlK ziU$vB9Xy!wi|79TF~Q5n{mR9g|Nj%dzkPQIOxVNP!N%ue0O6d!2Sgwcl&^SSy?)`G auZOaa|D{yMF;VakWNKuAeRJF`;{OA*pM-S) literal 0 HcmV?d00001 diff --git a/Sources/Login/Resources/Media.xcassets/Artemis-Logo.imageset/favicon.svg b/Sources/Login/Resources/Media.xcassets/Artemis-Logo.imageset/favicon.svg new file mode 100644 index 0000000..d3aaf1c --- /dev/null +++ b/Sources/Login/Resources/Media.xcassets/Artemis-Logo.imageset/favicon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Sources/Login/Resources/Media.xcassets/Contents.json b/Sources/Login/Resources/Media.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Sources/Login/Resources/Media.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Sources/Login/Resources/en.lproj/Localizable.strings b/Sources/Login/Resources/en.lproj/Localizable.strings index 8764538..2a15f31 100644 --- a/Sources/Login/Resources/en.lproj/Localizable.strings +++ b/Sources/Login/Resources/en.lproj/Localizable.strings @@ -1,4 +1,9 @@ -// MARK: LoginView +// MARK: - General +"ok" = "OK"; +"select" = "Select"; +"done" = "Done"; + +// MARK: - LoginView "account_screen_title" = "Welcome to Artemis!"; "account_screen_subtitle" = "Interactive Learning with Individual Feedback"; "login_please_sign_in_account" = "Please sign in with your %@ account."; @@ -11,20 +16,16 @@ "account_change_artemis_instance_label" = "Select university"; "login_forgot_password_label" = "Did you forget your password?"; "login_username_validation_tum_info_label" = "If you are a TUM student, your username should have the format ab12xyz. Do not include '@mytum.de' or '@tum.de'."; -// captcha + +// MARK: Captcha "account_captcha_title" = "You have entered your password incorrectly too many times :-("; "account_captcha_message" = "Please go to [%@](%@), sign in with your account and solve the [CAPTCHA](%@). After you have solved it, try to log in again here."; "account_captcha_alert_message" = "You entered your password incorrectly. Solve the capture to continue."; -// MARK: InstanceSelectionView -"account_select_artemis_instance_select_text" = "Please select your university:"; +// MARK: - InstanceSelectionView +"account_select_artemis_instance_select_title" = "Please Select Your University"; "account_select_artemis_instance_custom_instance" = "Your custom Artemis instance URL"; "account_select_artemis_instance_error" = "The URL is incorrect or does not link to an Artemis instance!"; -// MARK: Errors +// MARK: - Errors "account_session_expired_error" = "Your session expired. Please login again!"; - -// MARK: General -"ok" = "OK"; -"select" = "Select"; -"done" = "Done"; diff --git a/Sources/Login/Services/LoginService/LoginService.swift b/Sources/Login/Services/LoginService/LoginService.swift index 272b98a..1e47f31 100644 --- a/Sources/Login/Services/LoginService/LoginService.swift +++ b/Sources/Login/Services/LoginService/LoginService.swift @@ -5,7 +5,6 @@ // Created by Sven Andabaka on 09.01.23. // -import Foundation import Common public protocol LoginService { diff --git a/Sources/Login/Services/LoginService/LoginServiceImpl.swift b/Sources/Login/Services/LoginService/LoginServiceImpl.swift index fc4e106..8cb041e 100644 --- a/Sources/Login/Services/LoginService/LoginServiceImpl.swift +++ b/Sources/Login/Services/LoginService/LoginServiceImpl.swift @@ -5,13 +5,12 @@ // Created by Sven Andabaka on 09.01.23. // -import Foundation +import Account import APIClient -import UserStore import Common import PushNotifications -import Account import SharedServices +import UserStore class LoginServiceImpl: LoginService { private let client = APIClient() diff --git a/Sources/Login/ViewModels/LoginViewModel.swift b/Sources/Login/ViewModels/LoginViewModel.swift index d14d4c6..8ea68c7 100644 --- a/Sources/Login/ViewModels/LoginViewModel.swift +++ b/Sources/Login/ViewModels/LoginViewModel.swift @@ -1,10 +1,10 @@ -import Foundation import APIClient -import Common -import UserStore import Combine +import Common +import Foundation import ProfileInfo import SharedModels +import UserStore @MainActor open class LoginViewModel: ObservableObject { @@ -33,7 +33,7 @@ open class LoginViewModel: ObservableObject { @Published public var usernamePattern: String? @Published public var showUsernameWarning = false - @Published public var instituiton: InstitutionIdentifier = .tum + @Published public var institution: InstitutionIdentifier = .tum private var cancellables: Set = Set() @@ -43,14 +43,14 @@ open class LoginViewModel: ObservableObject { self?.username = UserSession.shared.username ?? "" self?.password = UserSession.shared.password ?? "" self?.loginExpired = UserSession.shared.tokenExpired - self?.instituiton = UserSession.shared.institution ?? .tum + self?.institution = UserSession.shared.institution ?? .tum } }.store(in: &cancellables) username = UserSession.shared.username ?? "" password = UserSession.shared.password ?? "" loginExpired = UserSession.shared.tokenExpired - instituiton = UserSession.shared.institution ?? .tum + institution = UserSession.shared.institution ?? .tum } public func login() async { diff --git a/Sources/Login/Views/InstitutionSelectionView.swift b/Sources/Login/Views/InstitutionSelectionView.swift index f093a84..f12a3b3 100644 --- a/Sources/Login/Views/InstitutionSelectionView.swift +++ b/Sources/Login/Views/InstitutionSelectionView.swift @@ -5,42 +5,42 @@ // Created by Sven Andabaka on 01.03.23. // -import SwiftUI -import UserStore import DesignLibrary import ProfileInfo +import SwiftUI +import UserStore public struct InstitutionSelectionView: View { - @Binding var institution: InstitutionIdentifier var handleProfileInfoCompletion: @MainActor (ProfileInfo?) -> Void - public init(institution: Binding, handleProfileInfoCompletion: @escaping @MainActor (ProfileInfo?) -> Void) { + public init( + institution: Binding, + handleProfileInfoCompletion: @escaping @MainActor (ProfileInfo?) -> Void + ) { self._institution = institution self.handleProfileInfoCompletion = handleProfileInfoCompletion } public var body: some View { - List { - Text(R.string.localizable.account_select_artemis_instance_select_text()) - .font(.headline) - ForEach(InstitutionIdentifier.allCases) { institutionIdentifier in - Group { - if case .custom = institutionIdentifier { - CustomInstanceCell(currentInstitution: $institution, - institution: institutionIdentifier, - handleProfileInfoCompletion: handleProfileInfoCompletion) - } else { - InstanceCell(currentInstitution: $institution, - institution: institutionIdentifier, - handleProfileInfoCompletion: handleProfileInfoCompletion) - } + List(InstitutionIdentifier.allCases) { institutionIdentifier in + Group { + if case .custom = institutionIdentifier { + CustomInstanceCell( + currentInstitution: $institution, + institution: institutionIdentifier, + handleProfileInfoCompletion: handleProfileInfoCompletion) + } else { + InstanceCell( + currentInstitution: $institution, + institution: institutionIdentifier, + handleProfileInfoCompletion: handleProfileInfoCompletion) } - .listRowSeparator(.hidden) } + .listRowSeparator(.hidden) } - .listStyle(PlainListStyle()) + .listStyle(.plain) } } @@ -54,7 +54,6 @@ private struct CustomInstanceCell: View { @State private var isLoading = false var institution: InstitutionIdentifier - var handleProfileInfoCompletion: @MainActor (ProfileInfo?) -> Void var body: some View { @@ -75,33 +74,10 @@ private struct CustomInstanceCell: View { .textFieldStyle(ArtemisTextField()) .keyboardType(.URL) .background(Color.gray.opacity(0.2)) - Button(R.string.localizable.select()) { - guard let url = URL(string: customUrl) else { - showErrorAlert = true - return - } - UserSession.shared.saveInstitution(identifier: .custom(url)) - - isLoading = true - - Task { - let result = await ProfileInfoServiceFactory.shared.getProfileInfo() - isLoading = false - switch result { - case .loading: - isLoading = true - case .failure: - showErrorAlert = true - UserSession.shared.saveInstitution(identifier: .tum) - case .done(let response): - handleProfileInfoCompletion(response) - dismiss() - } - } - } - .buttonStyle(ArtemisButton()) - .loadingIndicator(isLoading: $isLoading) - .alert(R.string.localizable.account_select_artemis_instance_error(), isPresented: $showErrorAlert, actions: { }) + Button(R.string.localizable.select(), action: select) + .buttonStyle(ArtemisButton()) + .loadingIndicator(isLoading: $isLoading) + .alert(R.string.localizable.account_select_artemis_instance_error(), isPresented: $showErrorAlert, actions: { }) } .frame(maxWidth: .infinity) .padding(.l) @@ -110,16 +86,42 @@ private struct CustomInstanceCell: View { if case .custom(let url) = institution { customUrl = url?.absoluteString ?? "" } - }.onAppear { + } + .onAppear { if case .custom(let url) = currentInstitution { customUrl = url?.absoluteString ?? "" } } } + + @MainActor + func select() { + guard let url = URL(string: customUrl) else { + showErrorAlert = true + return + } + UserSession.shared.saveInstitution(identifier: .custom(url)) + + isLoading = true + + Task { + let result = await ProfileInfoServiceFactory.shared.getProfileInfo() + isLoading = false + switch result { + case .loading: + isLoading = true + case .failure: + showErrorAlert = true + UserSession.shared.saveInstitution(identifier: .tum) + case .done(let response): + handleProfileInfoCompletion(response) + dismiss() + } + } + } } private struct InstanceCell: View { - @Environment(\.dismiss) var dismiss @Binding var currentInstitution: InstitutionIdentifier @@ -128,7 +130,6 @@ private struct InstanceCell: View { @State private var isLoading = false var institution: InstitutionIdentifier - var handleProfileInfoCompletion: @MainActor (ProfileInfo?) -> Void var body: some View { @@ -148,33 +149,35 @@ private struct InstanceCell: View { .cardModifier() .loadingIndicator(isLoading: $isLoading) .alert(R.string.localizable.account_select_artemis_instance_error(), isPresented: $showErrorAlert, actions: { }) - .onTapGesture { - UserSession.shared.saveInstitution(identifier: institution) - Task { - let result = await ProfileInfoServiceFactory.shared.getProfileInfo() - isLoading = false - switch result { - case .loading: - isLoading = true - case .failure: - showErrorAlert = true - UserSession.shared.saveInstitution(identifier: .tum) - case .done(let response): - handleProfileInfoCompletion(response) - dismiss() - } + .onTapGesture(perform: select) + } + + @MainActor + func select() { + UserSession.shared.saveInstitution(identifier: institution) + Task { + let result = await ProfileInfoServiceFactory.shared.getProfileInfo() + isLoading = false + switch result { + case .loading: + isLoading = true + case .failure: + showErrorAlert = true + UserSession.shared.saveInstitution(identifier: .tum) + case .done(let response): + handleProfileInfoCompletion(response) + dismiss() } } } } -struct InstitutionLogo: View { - +private struct InstitutionLogo: View { var institution: InstitutionIdentifier var body: some View { if institution.logo == nil { - Image("Artemis-Logo") + Image("Artemis-Logo", bundle: .module) .resizable() .scaledToFit() } else { @@ -187,7 +190,7 @@ struct InstitutionLogo: View { .resizable() .scaledToFit() case .failure: - Image("Artemis-Logo") + Image("Artemis-Logo", bundle: .module) .resizable() .scaledToFit() @unknown default: @@ -198,12 +201,10 @@ struct InstitutionLogo: View { } } -extension InstitutionIdentifier { +// MARK: - InstitutionIdentifier+Logo +extension InstitutionIdentifier { var logo: URL? { - switch self { - default: - return URL(string: "public/images/logo.png", relativeTo: self.baseURL) - } + URL(string: "public/images/logo.png", relativeTo: self.baseURL) } } diff --git a/Sources/Login/Views/LoginView.swift b/Sources/Login/Views/LoginView.swift index b2b2500..e0959ed 100644 --- a/Sources/Login/Views/LoginView.swift +++ b/Sources/Login/Views/LoginView.swift @@ -1,7 +1,7 @@ -import Foundation -import SwiftUI import Common import DesignLibrary +import Foundation +import SwiftUI public struct LoginView: View { enum FocusField { @@ -10,20 +10,19 @@ public struct LoginView: View { @StateObject private var viewModel = LoginViewModel() - @State private var showInstituionSelection = false + @State private var isInstitutionSelectionPresented = false @FocusState private var focusedField: FocusField? - public init() { } + public init() {} public var body: some View { GeometryReader { geometry in ScrollView { VStack(spacing: .xl) { - header .padding(.top, .xl) - Text(R.string.localizable.login_please_sign_in_account(viewModel.instituiton.shortName)) + Text(R.string.localizable.login_please_sign_in_account(viewModel.institution.shortName)) .font(.customBody) .multilineTextAlignment(.center) .padding(.top, -.l) @@ -58,27 +57,27 @@ public struct LoginView: View { .toggleStyle(.switch) .tint(Color.Artemis.toggleColor) } - .frame(maxWidth: 520) - .onSubmit { - if focusedField == .username { - focusedField = .password - } else if focusedField == .password { - focusedField = nil - viewModel.isLoading = true - Task { - await viewModel.login() - } + .frame(maxWidth: 520) + .onSubmit { + if focusedField == .username { + focusedField = .password + } else if focusedField == .password { + focusedField = nil + viewModel.isLoading = true + Task { + await viewModel.login() } } - .toolbar { - ToolbarItemGroup(placement: .keyboard) { - Spacer() + } + .toolbar { + ToolbarItemGroup(placement: .keyboard) { + Spacer() - Button(R.string.localizable.done()) { - focusedField = nil - } + Button(R.string.localizable.done()) { + focusedField = nil } } + } Button(R.string.localizable.login_perform_login_button_text()) { viewModel.isLoading = true @@ -99,14 +98,20 @@ public struct LoginView: View { } Button(R.string.localizable.account_change_artemis_instance_label()) { - showInstituionSelection = true + isInstitutionSelectionPresented = true } - .sheet(isPresented: $showInstituionSelection) { - InstitutionSelectionView(institution: $viewModel.instituiton, - handleProfileInfoCompletion: viewModel.handleProfileInfoReceived) + .sheet(isPresented: $isInstitutionSelectionPresented) { + NavigationStack { + InstitutionSelectionView( + institution: $viewModel.institution, + handleProfileInfoCompletion: viewModel.handleProfileInfoReceived + ) + .navigationTitle(R.string.localizable.account_select_artemis_instance_select_title()) + .navigationBarTitleDisplayMode(.inline) + } } } - .padding(.bottom, .m) + .padding(.bottom, .m) } .padding(.horizontal, .l) .frame(minHeight: geometry.size.height) @@ -114,19 +119,27 @@ public struct LoginView: View { } .scrollDisabled(!viewModel.captchaRequired && focusedField != .password) } - .loadingIndicator(isLoading: $viewModel.isLoading) - .background(Color.Artemis.loginBackgroundColor) - .alert(isPresented: $viewModel.showError, error: viewModel.error, actions: {}) - .alert(isPresented: $viewModel.loginExpired) { - Alert(title: Text(R.string.localizable.account_session_expired_error()), - dismissButton: .default(Text(R.string.localizable.ok()), - action: { viewModel.resetLoginExpired() })) - } - .task { - await viewModel.getProfileInfo() - } + .loadingIndicator(isLoading: $viewModel.isLoading) + .background(Color.Artemis.loginBackgroundColor) + .alert(isPresented: $viewModel.showError, error: viewModel.error, actions: {}) + .alert(isPresented: $viewModel.loginExpired) { + Alert( + title: Text(R.string.localizable.account_session_expired_error()), + dismissButton: .default( + Text(R.string.localizable.ok()), + action: { + viewModel.resetLoginExpired() + } + ) + ) + } + .task { + await viewModel.getProfileInfo() + } } +} +private extension LoginView { var header: some View { VStack(spacing: .l) { Text(R.string.localizable.account_screen_title()) diff --git a/Sources/SharedModels/Conversation/BaseConversation.swift b/Sources/SharedModels/Conversation/BaseConversation.swift index 3328d2f..ec2ad6a 100644 --- a/Sources/SharedModels/Conversation/BaseConversation.swift +++ b/Sources/SharedModels/Conversation/BaseConversation.swift @@ -35,6 +35,7 @@ public protocol BaseConversation: Codable { var unreadMessagesCount: Int? { get set } var isFavorite: Bool? { get } var isHidden: Bool? { get } + var isMuted: Bool? { get } var isCreator: Bool? { get } var isMember: Bool? { get } var numberOfMembers: Int? { get } diff --git a/Sources/SharedModels/Conversation/Channel.swift b/Sources/SharedModels/Conversation/Channel.swift index 7576d3d..bd15176 100644 --- a/Sources/SharedModels/Conversation/Channel.swift +++ b/Sources/SharedModels/Conversation/Channel.swift @@ -18,6 +18,7 @@ public struct Channel: BaseConversation { public var unreadMessagesCount: Int? public var isFavorite: Bool? public var isHidden: Bool? + public var isMuted: Bool? public var isCreator: Bool? public var isMember: Bool? public var numberOfMembers: Int? diff --git a/Sources/SharedModels/Conversation/GroupChat.swift b/Sources/SharedModels/Conversation/GroupChat.swift index a74ccae..9b18abc 100644 --- a/Sources/SharedModels/Conversation/GroupChat.swift +++ b/Sources/SharedModels/Conversation/GroupChat.swift @@ -18,6 +18,7 @@ public struct GroupChat: BaseConversation { public var unreadMessagesCount: Int? public var isFavorite: Bool? public var isHidden: Bool? + public var isMuted: Bool? public var isCreator: Bool? public var isMember: Bool? public var numberOfMembers: Int? diff --git a/Sources/SharedModels/Conversation/OneToOneChat.swift b/Sources/SharedModels/Conversation/OneToOneChat.swift index 37ef8e7..3629496 100644 --- a/Sources/SharedModels/Conversation/OneToOneChat.swift +++ b/Sources/SharedModels/Conversation/OneToOneChat.swift @@ -18,6 +18,7 @@ public struct OneToOneChat: BaseConversation { public var unreadMessagesCount: Int? public var isFavorite: Bool? public var isHidden: Bool? + public var isMuted: Bool? public var isCreator: Bool? public var isMember: Bool? public var numberOfMembers: Int? diff --git a/Sources/SharedModels/Conversation/UnknownConversation.swift b/Sources/SharedModels/Conversation/UnknownConversation.swift index 07500f5..7d676c2 100644 --- a/Sources/SharedModels/Conversation/UnknownConversation.swift +++ b/Sources/SharedModels/Conversation/UnknownConversation.swift @@ -18,6 +18,7 @@ public struct UnknownConversation: BaseConversation { public var unreadMessagesCount: Int? public var isFavorite: Bool? public var isHidden: Bool? + public var isMuted: Bool? public var isCreator: Bool? public var isMember: Bool? public var numberOfMembers: Int?