From a5fe4ba825d4c6ca25c99422fd3381768ff89a7c Mon Sep 17 00:00:00 2001 From: beom84 Date: Thu, 23 Jan 2025 15:44:46 +0900 Subject: [PATCH 01/25] [feat] #63 OnboardingStartScreen Graphic --- .../onboardingstart/OnboardingStartScreen.kt | 23 +- .../res/drawable/img_onboarding_start.xml | 382 ++++++++++++++++++ 2 files changed, 396 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable/img_onboarding_start.xml diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt index ba699e35..28bc1c79 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt @@ -3,10 +3,12 @@ package org.android.bbangzip.presentation.ui.onboarding.onboardingstart import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -28,29 +30,31 @@ fun OnboardingStartScreen( ) { Column( modifier = - Modifier - .fillMaxSize() - .padding(start = 16.dp, end = 16.dp, bottom = 16.dp), + Modifier + .fillMaxSize() + .padding(start = 16.dp, end = 16.dp, bottom = 16.dp), ) { Text( text = stringResource(id = R.string.onboarding_start_title), modifier = - Modifier - .fillMaxWidth() - .padding(top = (LocalConfiguration.current.screenHeightDp * 0.184).dp), + Modifier + .fillMaxWidth() + .padding(top = (LocalConfiguration.current.screenHeightDp * 0.184).dp), style = BbangZipTheme.typography.title2Bold, color = BbangZipTheme.colors.labelNormal_282119, ) - Spacer(modifier = Modifier.weight(1f)) + Spacer(modifier = Modifier.height(32.dp)) Image( painter = painterResource(id = R.drawable.img_onboarding_start), - modifier = Modifier.fillMaxWidth(), contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .aspectRatio(8f / 9f) ) - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.weight(1f)) BbangZipButton( modifier = Modifier.fillMaxWidth(), @@ -67,5 +71,6 @@ fun OnboardingStartScreen( @Composable private fun OnboardingStartScreenPreview() { BBANGZIPTheme { + OnboardingStartScreen() } } diff --git a/app/src/main/res/drawable/img_onboarding_start.xml b/app/src/main/res/drawable/img_onboarding_start.xml new file mode 100644 index 00000000..192ee020 --- /dev/null +++ b/app/src/main/res/drawable/img_onboarding_start.xml @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f3d77e1697e56682bfefbf079c37628523e2c8b8 Mon Sep 17 00:00:00 2001 From: beom84 Date: Thu, 23 Jan 2025 16:07:25 +0900 Subject: [PATCH 02/25] =?UTF-8?q?[feat]=20#63=20OnboardingEndScreen=20Grap?= =?UTF-8?q?hic=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboardingend/OnboardingEndScreen.kt | 36 +- .../onboardingstart/OnboardingStartScreen.kt | 2 +- .../main/res/drawable/img_onboarding_end.xml | 400 ++++++++++++++++++ .../res/drawable/img_onboarding_start.png | Bin 11989 -> 0 bytes 4 files changed, 425 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable/img_onboarding_end.xml delete mode 100644 app/src/main/res/drawable/img_onboarding_start.png diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt index e26c00e9..c2136e7c 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -14,6 +15,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.android.bbangzip.R import org.android.bbangzip.presentation.component.button.BbangZipButton @@ -29,9 +31,9 @@ fun OnboardingEndScreen( ) { Column( modifier = - Modifier - .fillMaxSize() - .background(color = BbangZipTheme.colors.backgroundNormal_FFFFFF), + Modifier + .fillMaxWidth() + .background(color = BbangZipTheme.colors.backgroundNormal_FFFFFF), ) { BbangZipBaseTopBar( leadingIcon = R.drawable.ic_chevronleft_thick_small_24, @@ -41,26 +43,30 @@ fun OnboardingEndScreen( Text( text = stringResource(id = R.string.onboarding_final_title), modifier = - Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp) - .padding(top = (LocalConfiguration.current.screenHeightDp * 0.184).dp), + Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp) + .padding(top = (LocalConfiguration.current.screenHeightDp * 0.081).dp), style = BbangZipTheme.typography.title2Bold, color = BbangZipTheme.colors.labelNormal_282119, ) + Spacer(modifier = Modifier.height(32.dp)) - Spacer(modifier = Modifier.weight(1f)) Image( - painter = painterResource(id = R.drawable.img_login2), - modifier = Modifier.fillMaxWidth(), + painter = painterResource(id = R.drawable.img_onboarding_end), + modifier = Modifier + .fillMaxWidth() + .aspectRatio(8f / 9f), contentDescription = null, ) + Spacer(modifier = Modifier.weight(1f)) - Spacer(modifier = Modifier.height(16.dp)) BbangZipButton( - modifier = Modifier.fillMaxWidth().padding(start = 16.dp, end = 16.dp, bottom = 16.dp), + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, bottom = 16.dp), bbangZipButtonType = BbangZipButtonType.Solid, bbangZipButtonSize = BbangZipButtonSize.Large, onClick = { onClickNextBtn() }, @@ -69,3 +75,9 @@ fun OnboardingEndScreen( ) } } + +@Preview +@Composable +private fun OnboardingEndScreenPreview() { + OnboardingEndScreen() +} \ No newline at end of file diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt index 28bc1c79..bb62b038 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt @@ -39,7 +39,7 @@ fun OnboardingStartScreen( modifier = Modifier .fillMaxWidth() - .padding(top = (LocalConfiguration.current.screenHeightDp * 0.184).dp), + .padding(top = (LocalConfiguration.current.screenHeightDp * 0.15).dp), style = BbangZipTheme.typography.title2Bold, color = BbangZipTheme.colors.labelNormal_282119, ) diff --git a/app/src/main/res/drawable/img_onboarding_end.xml b/app/src/main/res/drawable/img_onboarding_end.xml new file mode 100644 index 00000000..0e42a9ae --- /dev/null +++ b/app/src/main/res/drawable/img_onboarding_end.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_onboarding_start.png b/app/src/main/res/drawable/img_onboarding_start.png deleted file mode 100644 index 3084cfbd93a89a68dbbdb48607503941d65f4bed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11989 zcmdsdcT`hNyYCK25dXz-bM7DCTKBHI7a==)W}fnUe)G)inR%zBp~%DlWdHzx zNm=QEHULn8w^RT$LGfV`(PI%l?)};rp0Q#qI!QUs{l#Dz8fce|;2a+Jfd=Y%e z;rY=TZ~4IeDhV7R{ReczW?44Pot zI6wTPM{fdX=D*^yH|>Q1!Ce8A`95zO#yMZ3bvC~;U-O_y)k$4nb-1}s(~z$8u1}f1 z0P4t|p>iu4aZ~nUi=AyO@Cz3NXEe9W1v-~_Z=|i{VC{vrbmj7A zC%NV!7;7-@5d?s?bfHOKtDY6^Zw)svrcM^~ra7k-7NuhR5B$&a5yE{C>&2zSSvkCt z!pc=37_#2vztMZKPb7b>r?+lY6=tUWB&}FO+xO@zU%g2oY444J8O6he1K3rB0L!zb z4QpLHOl1vfSoD}olk%V`UXAHVSPmkdfWwY?9kP_wPQU*Q=i#Ac1v1;YYFD=f63q@) zHP#%J8B4Y$YB{k>7diNFwHsY{?s8^o3D89?>SBu5*sy!)oZ}5Mz9k8~>a#a{^XQI6jOEeVT=dSS~(Eo`&Z2`WkihNEG79bK;`hkHDHI4VWQ%C9eY)ZB*wY8Nk42%%&oBncj9k5gV_Mn(bpY>nV-q+FX z-A7W&O&DJ-rl7La(uVym&0n@@C+vAyfhh-;pd$~)uH0ERWwdn~jpSz2H@^j3v$Jv@ze8f=y}Li;VypmFR^Y)ZS;lomXL&7p z=NkTcK`}x&f2>%fVSYvi`3lg#3cSUztT%3sbjGkyj4(!)Pof&p^V7xhyEia*0Y&b=r={%e?nU&oyY47*}R^%aN0|KtLquZP)UIyp)|W(a7#D z^(N6bmevGx zKViC+TT$wl0NI~_tC*%fF1Dlv)O-Bb^?z+1r0^or;B2p3WdfI`ce5!;$d~rEtbhcv z0lkxpi7aicQS}Q2%R9OeLIzhG<2p`d8$Aa49!zS((YPZy`7!bR&q6?`0?eDSAg0oVV4&nURs;AJV&bwKyrJRiNSTXgwokoZprfR2S2*#TuCd>|CEBp|Nb%| z=WjY@6Li&~6wW4r62>Onu;K@Lf;oT_uDh!lDLP(B>tQU2VXSQak2@>@b9rN6Q8b<-;f(`d#$j>JvEe7n+8nA6%LtRrjiWFIt&Hqh#&(E0T6Rf4VUM{ zKMuWzpSJvb6`&vNO6dM&-ua>1`z;INb$fAl{?h2-XB$)Nf%5(CcOfW8tL~0Q&m=gr zrC8(8!(z4?H#q>xRs-}$gGv4Hwb~~OB}Y^*m9FK_{JEhUb@L%8Fh~neXaS}U|8=o< z&DZ4)&osa6e(JJ`-L_$53Ps1;-zMOm&x~xX>Ekb5=D5V(|0VDUdg*p%OqSL8u!j*5 z;YF^G%2cwiT#JZME;KL}>GZ#`-ZZGK92@_%(!IA+I-fT#;cWghk^E<>#a=7ed{d|5 ztpj~j_4#4!NN%sg&@gt);ZTN|v4N`p?Nz}3>YvQ4T{?GCc?el4@u`)>VvmdDg#K*M z3}xYx-MVXWt&?dYnG063YEq-hB44ByTY!u<7#-$PPZ2i}zi>TXbwB-bokP;#q8;z%X(5SI zL1F_p*BWN>&ZXUu|MWI&>HCxw=OoJH6=~1j4S}v+ku*_k2VaJw=0!g?sP|r;Mi?L4=9rlwn6< zQI+ms)~^P*J;7ylf23?!+g@iOJZX6auj8*7HT#Lk94pve7VTLFKdo>a)9KI}oR868 z-evGeKMo-_6asI%iuXtS$#3rt%N_-v-ilm)F&;c0a?l8!U}xcmOH3|hZrk$^Q}(Q zKK7S-rsd%I4W@DWQD_M2XtSfr|Cdg3wOfqe1rf)tzor_=x~u@Z(^}mviAK_T?WW|` zS_4M9sIwbC70Ee%@U2V&CTlw2B)JU@wvKV?acUo&k%X@u<~2x0^OL9$jV+9YLUZYW{ER@oPSJz){|S$P6+@UgM1=S&j@*Mh`R>`kX7 zJeE`?0ykrm8-q9_o|?LlX$;J3CSdf_t*3xzPj^EZ_FHlJh1GY6<>1G@NAB>sr`#?G z*tzko4YZ(eB63Fe6KbUcYsX3T{1cG5)=1DWH!xZFcs(O;e5W6}>pJ#?lh2Q?+Ic81 z6!Tr``~6t{CFAuJ2f^$2?m`rP{qpYEQsoo=+$+j~CU3}B<;#gzE7N!{6;(L(5|5(V zemD77J@4teCjwzyCyl>nMBe9-V+DrI{vx>GPsRP7LoF?^jI6d=#EPAlRgp^3CC@k? zkvo<*uy@7}UFBK!eCBxdqUF!gU!(!xsN;nEeTh)wq1K*`(p>6aGlK{AVJ2r04@`>7 z^+0_B(^I8s<4r+kX1L1t*b1u@7+|WcZBmAz3Z_?q0-=RpCMDu(@r1(aqpd{# zq3$}hPkWem+&{-K$$F&>IvbdEc`K~b#0~C~9(Ex^Dab24BB0Wq|9cC&=7-2JYszEi9{y!VXNP1$MnTM%ySuK~XM5zh`P~pnDO_r0M3>dVgHNl}%8rrV@=BvoM=lL^fIeVBAzlkk9vlp&Md0VasL(jBJ}F$np#CSweNbJK=@U*%v94@u%$b|YxiOFN z^l@<^2bC{3Kv)DszPm~)N7{&GG3@sBN_!W=X}`Uo3Qi`GdotEzJsaVXo%XAX<)GLu zZ?%fZn}X(kokQ~C3hIvmEswf@gX?dqDeDe8dFnM_mF16ID;a6ssN8&`P=)PmAag!- z$Oyy1Uu@TFD%}yKY@ez+EN)i{4_EGvhv&g*CFDz=6-WzQSZTX%aJ9hu_dPuO$4o2@ zV|@1l(poKeJ%y*P9dVoOMq|%qOXc?IKv8C(wA?vwgh}QBX$`$G41P$B`bo zMg3!iZ3|7NNo)=IlU4yqrut#Mcgl=xo$`*;#h21257`3 z59*gkzFe>uta2FeT`2D79B$?BNU;4#qu>mJqGOYBOC1s&`Qya(x{b5&zI1C&8clri zNIu^M^PGEjIsw~=M}OgTZ2Q$8(6Iw%>KUy5k|| zS$FSlpg?LtY4d!5SENTL75}?V>et)#=`Z|98gH;_0@I(0L*X+{K?dbp z*-K%G_T!)0ddh#UFE$!d2PcD>2$M|w>%&vAb_kd3dg&or7CFE}h8(m;PUn~|zrF#Y7C*r?y$ z7WaD#k@<>E9t*`zd(Y~4(`{7E9mmJSC1@D{N8ut@Q4!_gJKm-B3%w(Y{pHNhaG$6r zs-2#0l*6kstE#;V{Cl76{zxh|&FXPgb~(}wH{;S8Eq@x!JQ(0(^CR)XsZ-go8b z%Il38oReX$FYO8aQFhSDb6 z8r+TTDY%)dicCv$#II;KSLz(}3d-7Sw!I-qTsZ-DCF5+Mk$&Oq`TBa@#bxcNdCr4G ztW$~MFgO#6IK}Mv)J-e<{wwH3D8{~`pi08_B2gN|T=<~T-I)eeg(^lJjZ!=>`Cj85 zQi%J~$L#nXlo)1(*58%RH_gff{~{gwEEqq0=z?D4!hj=h?!cLZ_D6bL96G+wbip6F zxv^byp9AVjwiZ7QRvnt)nFlLk4~OU^q^0@#{Q6^5&+;ihO8Ss$%Ac*qpUs=1SDmYu zWEv)hl(z8@?y9c3Hkxcus%1%RzIBZ5ws8<;wR=o}26)@sW)L{IBmObP4FDd1@92QS z>#N`z(Er1?SDiR5P5qg#5_Z>(^FKD$dFTaa ziA9K15oMguZm`rXWunM#uxHJk5E6>CzNB{`-aY51U>)PlY-?k5$dE1xx5{eS3swjZ5tOp5dPkf8QyTI2W{c4$nFxv*v?8G2>3! zGghQeUr)2;vHv$EKJ7lf>1*jkjRt z-Of+F2KO`sEhTg-=C*kSl z)&NiMk@s#0-dUf+oVgZzIID;`(+;9=k%%qk<(s4`FdUykw7cNs>S!q*^TtoR;k!nP zw~N}Z1FcsSZGn3a@uhVkl)W3G)LKkTa@0JM<*XA>l=XWQP+~$e2k$Dii*fK-BQb*JTKCxieaZxb)tvKbaezrq^3rQs zGz}>6RPZ;+&g2Z#PuN#R$4091g_an^JxOnuev&>4?$o+|k@+_n9TIxckK%We;ms9_ zMEPk9#LZ0XRXSM)>e6Sf2;>$P)~6 z<`)T+?60ukWlQH+9Kmp1A#Uv%s zkXnoJO9>?Ur4d~VkoZy8$3ev0tGP&y;RX(jpBCy>?%C4tWXHQwLhd>C29QE|Z6S`Yosue^ATCMm4Jl6Dzs+ZyXtKI=tOSfjw_ z6z(US3dr&goj;#qMp~A~hzyR$c%fP~g2yeT;skNn z7}o8Bi`TIeIRLNn*_|DEk{urO_789jb0Bc#AaKdHF1?rH`o7g)2qyK(dejrhOuIq2 zqAcN2JuMuW&lYeL%;W$BON;eTmmDBavhEAhl=6Io3fYB-xFoja?LWENzd=KqZ&pYlh^Pq z;d?D5YQd6I!MUQn(=e^?M1jelR;LX*X{D%Jn1jcy1;DcIPTi(|mi6y-(t1-YQXyI_ zm(yr?Xlj`iOz}TPHr0abS;2mIk+J+d9pMjmxTsP4&Fx@2^$u|i?OHTqAumjzqEaQ^_qeb;$}2)6%6X4)eg1QRHH7+_c@+6l3f9+CoZR`>6*!iU8s8`(s@6x-ZxRI^M#8-L~Yb z){-EO%m1L3`7U(j6d(gEN2P&frB`)O|Fi5D0lIR8cupJq=5!xbG?h6WPie%wqZ_}1 z9wV4jBWNbwUmYC}8J3s(L60Xvj}@IqrqzOrj$xi)Aj%nJ{_)t5-V0>)3dm|jj^Zy# zfZj1{YtC<}jAq&aRB3}u#+hJNbh87qVhpAzkY8csIA=%DG>%Hnk|?PVOWyuUAg6p3 z;+7_%KPL_;(*KkAW^KD`5Nav~xsQKP88RFg3l@PR5F?xUKB4k!)A1!8OPAq4o9izM8NbSa z(EC88d>}ZGvY?DwFXQ6&Bw$R%VyZSh-Hkw2h2CB;#nYc(f?kUE^DD7d8*k~%H&iT8 zGLXA5w~Z0yced2e0H-RRG>6_64$!^*zGX)LLpr+q+?4k$Ukiw>!QeD+CL5gQoxXg$ zv3cgxe|lR~3;0+>u-|GVXcs=^v>rVC$v)%ycC)5!f8xoZ^Fc+$dyDL8s%WAcg&`+) zaJu|>TGD2f%iy)ofv^ro3%BF+7iY=_o)|Bw>i%X^fIfSpGB+1Wd;Ctw4Lx;87rj~Y z?T@H8a^$6cw>Fj+g|$GqFQR;Kv|Q}3vWhzm$FBV>O}kd_h5$GaCV$IZCy`imiO};G zg58&E^odaY_eNy{za~Jzpg?^Vgo~`_`LzG;7kDId9(h``^{HTq_a#%ph0F=JxWe2w$jk9vG z*)XT`LXKe5-*Ye8hx`o$XgzuAMVT&93^XWCzl=O*Uw3Iz<^5#~jFQ~I;-XcAi%%D< z_jN?6N%6oyE3{Jpsv%^~sO|m7oqw~@dE9e<2VY9E$t}}KcoqDpYi?b42EOcot4z<4 z-3S};y36k{^_wo^08P+6)LkT6A3B59vLj5gq9{MxcPZKtqlGGv4P|1dM5aUhu)lLg zjQ>1heXRCTv!R5VglMzjaJsrY0(|r_>D-Kk{NK8}FN9s=9QVI3XWAaWPjAHkco7Z` zKOGirpKh#AZebmpOh*`6VlxhBvwl|$gjg_^XG`jdQVwx@O3xKYXo~Qw2j_+;O^E*Q z-?J8uNWbrWN<&8AzWy%+u{d1Pq~Hpv;t zQqZfL3DAkEtjKr#w$En#oDtKDCh}50dWsi?L2Uo#o5gs&O+oGRqjiIA$zo%` zR(_|y|Mx%)&iNbNiCiq+pi=Bw)V7R9pwUIjlIv{f#j@7@>GE4g+rlbG114V5F*%I`HJcqvNvx zBnIK6l{XRYkKz-nO1qtK!wWc)Z)ruv<=lztqM7)_uDbSp&V7lIJ<5>{(~fJvfQ8I> zY=N#wvE8>q(Lr%C=8qdlTXxEH6G23NwUx5;!4d7HuHjA|oJSH4f3Gz2A;(r6P(DZR z#&wlY$g;VQh@<{5W-4B*IwWPgk((o;TjmYu1HD!3;r0azN>gSyJ?0{pj(1_vIoW^L zZ>9r<)^G0~jRw`S-LR-sln!{_jd2aM+*|P#9{XXWf2T`z-1Mr`_H9C7Cy7_2Rg>Fng43n^o*ie~!h>RD5`QyUH?0!t#;z_kD44g5@CxMdgG%xy{O=(R*%7 zr?hGBJ}Mxi{;*Ki_ls|tOW!=Xf-kPHJ1gd4#`5ME2d7J!2HL?XCGU+ZG1#4vO>b`3 z{0G<-$M^fBob26P^~}p=+>8WPuL@b@^LOu4ZnYzxuv2jD`3I^2;z zh~pk6HZALS-!k=ckP|*naZxFq>p>+mZJ3XbXk+RRq!WtCiNe{^0;W0G(PniKixjRI z#Ydh~SOf;6h|ZTlu6aQdRTyic>@`FmYiG-QwNn<^DHl5Sqe3?kqFGT0nAoQZN%-L)~1_zbXGk*d#%PUU6yhvZY)MrxtwxGs8E|lscE$NSrJoU-38g%tmG|Z+Oo{i zNU}RwXm;zMs4?#b8{B@ErRwPSI(q8z#SvY04V2r$M?ckf?363)6zh(CdF~m+3Oi+C zyX{juSKxluR%Fk5;rwO!j<3%$TI<95WU#rN5o4zFt29z|g~?!k#J;Suex!dzSkkO_ zL$>b2Ep-c@>UvGILS36`&O5Tro_RJNv)s~JjB=fUMnsNyuRGxFi^du{B%BSOfZ=*~ z{7>a3S+O162*;a^HxT0TgAQl#j&Ys=^A|ZO>m-XM6UDCNYII5IZ{34fov@tnAaT9; zuHq8i>{xKn07rtRI~);J7y`?Yy|MB5$Q_TuaS~gx4e^;xzPf=}u1@EW&O?XihD%wm zuC4yc9=J0hS!>yV3v1I3VpB2EL0)XKZIK)0Y4m{MO zVD=asUf-Uk0f1oo|95X~kkmjyvzpUgq>dfuLB98gEgidSQn?1os$sFF#bO7y`05&Y z1v!O^OfPA}Zhi9f)U^)XEBuL8y+ZPG%%OajpNp}Y!JP?q1m_j%Je_kRa&{Fkw)6r) zMosOYc`E6J$R%{o)A5AP8hJeKy8fs~P|xCvJFu$F=bYpFLY&zB+OD=QMK*Mnuc&|% z*Wz4t2qzbcNVAEBfxTzza=g5EjO+7@3E`^4{_T8Q4nF$pB{Q;DI_HN2r|XvGHcihHT!z-T5e6h~(!1Gi%mBC! z2p%H(Zu&?^vq3@Jf(%1>_LXahmmXG0CsW!9j`K9G!)x4uibqkUdGr8NI29mKP;JC0 zxqw>NpD1~QdCZ@Kvdf!qB0H+fEF_HYHI+HIP3T}^fJOk6Yx((&S5M=V`)>MCm$i8( z?k$7(yhCS0=_t7)C})*`%^mE&j8_8E-+*GHOLOfU*YKr}tNY2*=-VfHIgQGFCLP8D z2uN7%-UZA%KsF){c=2dTY`I|vX}te|iA7M!5jMd1zSn_tVx9F|~ zO|Nv1|7t?4wE>{z44T}Pmmc&2q=`|7J@jD7W5j>C8)*%wgWW+FTo>-Sy^g|&CijMK z<65o*S~g&V_w||qg~tB2#vS%B;a}pz9$%#~qQQChAV5)@bdS#g9;qXNXBm!JVVC)@qGCv z9rk`{s(rfrI9pC?dxm)ye#8+8=gJ9zG>|@+lw47Yt=IG`jC~dc56??{>alF>S54$L zvf+GqcJzks;s@@J&3D8Bh4Y>nJ7ReHfko*z;*em+OaM6FRmC<80t64Y_xxeq9t7QcXr3{+{waa24zC42xiDZa$?SWN|@*H&pZplOU2j0o175aZKMdi1P>2hyQzK6 zNbxO3Ng5RioQMEbT2|>+N1hgL=PCe?ycH-&?;f`nqXu+eAKN3mEj+9uZL{)1MGKT2 zuhaa-SWx`m3S0bLAcj^eFS@k;&xVvJG3sj@?-|X(^<`6n-2TjaGU*ZJ=uYD@;@CKF zL;ZjI^7o&=68^VOyNv1fmopFpFe<8B#l@DKkTWyHH_>2z`B(2Ne8xbq9={YzuJBlT z!z(dFX7v~V*6k#&3TNrZ& zu+**%y8QHC5A%Pu9PuAR^8ayNkX8SZ3))4YWBnQJ;o~>^*Req5hZ+w`?^(Y5AHihp AkN^Mx From 0f85c3c6ee0b5c68032a04c7a3d997d6cd1a647e Mon Sep 17 00:00:00 2001 From: beom84 Date: Thu, 23 Jan 2025 17:41:06 +0900 Subject: [PATCH 03/25] =?UTF-8?q?[feat]=20#63=20friend=20dummy=20profile?= =?UTF-8?q?=20graphic=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/component/card/FriendCard.kt | 11 +++- .../model/card/FriendCardModel.kt | 4 +- .../presentation/ui/friend/FriendContract.kt | 8 +++ .../presentation/ui/friend/FriendScreen.kt | 2 +- .../res/drawable/img_friend_profile_1.xml | 52 +++++++++++++++++++ .../res/drawable/img_friend_profile_2.xml | 52 +++++++++++++++++++ .../res/drawable/img_friend_profile_3.xml | 52 +++++++++++++++++++ .../res/drawable/img_friend_profile_4.xml | 52 +++++++++++++++++++ 8 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/img_friend_profile_1.xml create mode 100644 app/src/main/res/drawable/img_friend_profile_2.xml create mode 100644 app/src/main/res/drawable/img_friend_profile_3.xml create mode 100644 app/src/main/res/drawable/img_friend_profile_4.xml diff --git a/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt b/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt index ffe1fd77..d09f3c82 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt @@ -12,14 +12,17 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp @@ -67,10 +70,14 @@ fun FriendCard( verticalAlignment = Alignment.CenterVertically, ) { Image( - imageVector = ImageVector.vectorResource(id = R.drawable.ic_user_one_default_24), + painter = painterResource(id = data.imgSrc), contentDescription = null, contentScale = ContentScale.FillBounds, - modifier = Modifier.size(48.dp), + modifier = Modifier.size(48.dp).clip(CircleShape).border( + width = 1.dp, + color = BbangZipTheme.colors.lineNormal_68645E_22, + shape = CircleShape, + ), ) Spacer(modifier = Modifier.width(16.dp)) diff --git a/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt b/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt index 3f7d0b47..fb50c24e 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt @@ -1,6 +1,7 @@ package org.android.bbangzip.presentation.model.card import android.os.Parcelable +import androidx.annotation.DrawableRes import kotlinx.parcelize.Parcelize import org.android.bbangzip.presentation.component.card.BbangZipCardState @@ -10,4 +11,5 @@ data class FriendCardModel( val friendName: String, val imageUrl: String, val state: BbangZipCardState, -) : Parcelable + @DrawableRes val imgSrc : Int = 0, + ) : Parcelable diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt index e8e8432d..26b5c8d0 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt @@ -2,6 +2,7 @@ package org.android.bbangzip.presentation.ui.friend import android.os.Parcelable import kotlinx.parcelize.Parcelize +import org.android.bbangzip.R import org.android.bbangzip.presentation.component.card.BbangZipCardState import org.android.bbangzip.presentation.model.card.FriendCardModel import org.android.bbangzip.presentation.type.FriendMenuType @@ -17,42 +18,49 @@ class FriendContract { friendName = "이승범", imageUrl = "https://example.com/alice.jpg", state = BbangZipCardState.DEFAULT, + imgSrc = R.drawable.img_friend_profile_1 ), FriendCardModel( friendId = 2, friendName = "김재민", imageUrl = "https://example.com/bob.jpg", state = BbangZipCardState.DEFAULT, + imgSrc = R.drawable.img_friend_profile_2 ), FriendCardModel( friendId = 3, friendName = "하지은", imageUrl = "https://example.com/charlie.jpg", state = BbangZipCardState.DEFAULT, + imgSrc = R.drawable.img_friend_profile_3 ), FriendCardModel( friendId = 4, friendName = "신우연", imageUrl = "https://example.com/alice.jpg", state = BbangZipCardState.DEFAULT, + imgSrc = R.drawable.img_friend_profile_4 ), FriendCardModel( friendId = 5, friendName = "김재민", imageUrl = "https://example.com/bob.jpg", state = BbangZipCardState.DEFAULT, + imgSrc = R.drawable.img_friend_profile_1 ), FriendCardModel( friendId = 6, friendName = "하지은", imageUrl = "https://example.com/charlie.jpg", state = BbangZipCardState.DEFAULT, + imgSrc = R.drawable.img_friend_profile_2 ), FriendCardModel( friendId = 7, friendName = "이승범", imageUrl = "https://example.com/alice.jpg", state = BbangZipCardState.DEFAULT, + imgSrc = R.drawable.img_friend_profile_3 ), ), val menuFilterType: FriendMenuType = FriendMenuType.ALL, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt index ebeee21a..8a1650e8 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt @@ -124,7 +124,7 @@ fun FriendScreen( modifier = Modifier .fillMaxWidth() - .padding(24.dp), + .padding(bottom=24.dp, start = 24.dp, end = 24.dp), ) { Text( text = stringResource(R.string.friend_boss_count, friendState.friendList.size), diff --git a/app/src/main/res/drawable/img_friend_profile_1.xml b/app/src/main/res/drawable/img_friend_profile_1.xml new file mode 100644 index 00000000..e89065df --- /dev/null +++ b/app/src/main/res/drawable/img_friend_profile_1.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_friend_profile_2.xml b/app/src/main/res/drawable/img_friend_profile_2.xml new file mode 100644 index 00000000..531cc308 --- /dev/null +++ b/app/src/main/res/drawable/img_friend_profile_2.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_friend_profile_3.xml b/app/src/main/res/drawable/img_friend_profile_3.xml new file mode 100644 index 00000000..22051688 --- /dev/null +++ b/app/src/main/res/drawable/img_friend_profile_3.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_friend_profile_4.xml b/app/src/main/res/drawable/img_friend_profile_4.xml new file mode 100644 index 00000000..ad76930b --- /dev/null +++ b/app/src/main/res/drawable/img_friend_profile_4.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + From f779aa34d4a02c9bd782fba630f573e3005dee3f Mon Sep 17 00:00:00 2001 From: beom84 Date: Thu, 23 Jan 2025 18:05:02 +0900 Subject: [PATCH 04/25] =?UTF-8?q?[feat]=20#63=20todo=20Empty=20view=20grap?= =?UTF-8?q?hic=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/todo/TodoScreen.kt | 135 ++++++++------- app/src/main/res/drawable/img_empty_view.xml | 161 ++++++++++++++++++ 2 files changed, 233 insertions(+), 63 deletions(-) create mode 100644 app/src/main/res/drawable/img_empty_view.xml diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index 68cac5b7..8280b5de 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -1,5 +1,6 @@ package org.android.bbangzip.presentation.ui.todo +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -9,6 +10,7 @@ import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -29,6 +31,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign @@ -70,10 +73,10 @@ fun TodoScreen( ) { Box( modifier = - modifier - .fillMaxSize() - .padding(bottom = bottomPadding.calculateBottomPadding()) - .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), + modifier + .fillMaxSize() + .padding(bottom = bottomPadding.calculateBottomPadding()) + .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), ) { LazyColumn { item { @@ -89,7 +92,13 @@ fun TodoScreen( if (todoState.screenType == ToDoScreenType.EMPTY) { item { Column(modifier = modifier.padding(horizontal = 16.dp)) { - EmptyView() + Image( + painter = painterResource (id = R.drawable.img_empty_view), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .aspectRatio(16f / 15f) + ) Spacer(modifier = Modifier.height(16.dp)) @@ -127,10 +136,10 @@ fun TodoScreen( item { Box( modifier = - Modifier - .padding(start = 24.dp) - .fillMaxWidth() - .height(58.dp), + Modifier + .padding(start = 24.dp) + .fillMaxWidth() + .height(58.dp), contentAlignment = Alignment.CenterStart, ) { Text( @@ -144,18 +153,18 @@ fun TodoScreen( Row( modifier = - Modifier - .padding(horizontal = 16.dp) - .fillMaxWidth(), + Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { Spacer(modifier = Modifier.weight(1f)) Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onCloseIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onCloseIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -234,11 +243,11 @@ fun TodoScreen( onClick = { onItemDeleteButtonClicked() }, label = stringResource(R.string.todo_delete_screen_delete_button_text, todoState.selectedItemList.size), modifier = - Modifier - .padding(horizontal = 16.dp) - .fillMaxWidth() - .align(Alignment.BottomCenter) - .padding(bottom = 16.dp), + Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth() + .align(Alignment.BottomCenter) + .padding(bottom = 16.dp), isEnable = todoState.selectedItemList.isNotEmpty(), trailingIcon = R.drawable.ic_trash_default_24, ) @@ -271,8 +280,8 @@ fun DateMessageCard( ) { Box( modifier = - modifier - .fillMaxWidth(), + modifier + .fillMaxWidth(), ) { Column(modifier = Modifier.fillMaxWidth()) { Column( @@ -376,35 +385,35 @@ fun StudyCountText( ) { Box( modifier = - modifier - .padding(horizontal = 16.dp) - .fillMaxWidth() - .height(58.dp), + modifier + .padding(horizontal = 16.dp) + .fillMaxWidth() + .height(58.dp), contentAlignment = Alignment.CenterStart, ) { Column( modifier = - Modifier - .padding(start = 8.dp), + Modifier + .padding(start = 8.dp), ) { Text( text = - when { - completeCount > 0 && remainingCount != 0 -> stringResource(R.string.todo_complete_count_text, completeCount) - remainingCount == 0 -> stringResource(R.string.todo_complete_remaining_nothing_text) - else -> stringResource(R.string.todo_complete_nothing_text) - }, + when { + completeCount > 0 && remainingCount != 0 -> stringResource(R.string.todo_complete_count_text, completeCount) + remainingCount == 0 -> stringResource(R.string.todo_complete_remaining_nothing_text) + else -> stringResource(R.string.todo_complete_nothing_text) + }, style = BbangZipTheme.typography.label1Bold, color = BbangZipTheme.colors.labelAlternative_282119_61, ) Text( text = - if (remainingCount != 0) { - stringResource(R.string.todo_remaing_count_text, remainingCount) - } else { - stringResource(R.string.todo_remaining_nothing_text) - }, + if (remainingCount != 0) { + stringResource(R.string.todo_remaing_count_text, remainingCount) + } else { + stringResource(R.string.todo_remaining_nothing_text) + }, style = BbangZipTheme.typography.title3Bold, color = BbangZipTheme.colors.labelNormal_282119, ) @@ -420,18 +429,18 @@ fun DeleteAndFilterIcons( ) { Row( modifier = - modifier - .padding(horizontal = 16.dp) - .fillMaxWidth(), + modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { Spacer(modifier = Modifier.weight(1f)) Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onDeleteIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onDeleteIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -444,9 +453,9 @@ fun DeleteAndFilterIcons( Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onFilterIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onFilterIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -465,10 +474,10 @@ fun EmptyView( ) { Box( modifier = - modifier - .fillMaxWidth() - .height(328.dp) - .background(color = BbangZipTheme.colors.backgroundAlternative_F5F5F5, shape = RoundedCornerShape(size = 32.dp)), + modifier + .fillMaxWidth() + .height(328.dp) + .background(color = BbangZipTheme.colors.backgroundAlternative_F5F5F5, shape = RoundedCornerShape(size = 32.dp)), contentAlignment = Alignment.Center, ) { Text(text = "Empty View") @@ -503,14 +512,14 @@ fun BbangZipToDoFilterPickerBottomSheet( Text( text = item.filter, modifier = - Modifier - .fillMaxWidth() - .applyFilterOnClick { onSelectedItemChanged(item) } - .background( - color = if (item != selectedItem) BbangZipTheme.colors.staticWhite_FFFFFF else BbangZipTheme.colors.fillStrong_68645E_16, - shape = RoundedCornerShape(16.dp), - ) - .padding(vertical = 8.dp), + Modifier + .fillMaxWidth() + .applyFilterOnClick { onSelectedItemChanged(item) } + .background( + color = if (item != selectedItem) BbangZipTheme.colors.staticWhite_FFFFFF else BbangZipTheme.colors.fillStrong_68645E_16, + shape = RoundedCornerShape(16.dp), + ) + .padding(vertical = 8.dp), textAlign = TextAlign.Center, style = BbangZipTheme.typography.body1Bold, color = BbangZipTheme.colors.labelNormal_282119, @@ -540,9 +549,9 @@ fun RevertCompleteBottomSheet( Text( text = bottomSheetTitle, modifier = - Modifier - .align(Alignment.CenterHorizontally) - .padding(vertical = 15.dp), + Modifier + .align(Alignment.CenterHorizontally) + .padding(vertical = 15.dp), style = BbangZipTheme.typography.headline1Bold, color = BbangZipTheme.colors.labelNeutral_282119_88, ) @@ -748,7 +757,7 @@ fun TodoScreenMockPreview() { ) TodoScreen( - todoState = mockTodoStates[0], + todoState = mockTodoStates[2], todayDate = listOf("2025", "01", "18"), bottomPadding = PaddingValues(), ) diff --git a/app/src/main/res/drawable/img_empty_view.xml b/app/src/main/res/drawable/img_empty_view.xml new file mode 100644 index 00000000..f71b1bed --- /dev/null +++ b/app/src/main/res/drawable/img_empty_view.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 0786c7622dc3549dfd80f439d70089fc7e6852a9 Mon Sep 17 00:00:00 2001 From: beom84 Date: Thu, 23 Jan 2025 19:14:31 +0900 Subject: [PATCH 05/25] =?UTF-8?q?[feat]=20#63=20todo=20graphic=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/todo/TodoContract.kt | 2 +- .../presentation/ui/todo/TodoScreen.kt | 132 ++++++++++------- .../main/res/drawable/img_no_peding_study.xml | 59 ++++++++ .../res/drawable/img_pending_study_zero.xml | 134 ++++++++++++++++++ 4 files changed, 271 insertions(+), 56 deletions(-) create mode 100644 app/src/main/res/drawable/img_no_peding_study.xml create mode 100644 app/src/main/res/drawable/img_pending_study_zero.xml diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoContract.kt index f69f4141..6a852abc 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoContract.kt @@ -124,7 +124,7 @@ class TodoContract { cardState = BbangZipCardState.COMPLETE, ), ), - val pendingCount: Int = 10, + val pendingCount: Int = 1, val remainingStudyCount: Int = 5, val completeCount: Int = 5, val todoFilterBottomSheetState: Boolean = false, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index 8280b5de..57a6e824 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -93,7 +93,7 @@ fun TodoScreen( item { Column(modifier = modifier.padding(horizontal = 16.dp)) { Image( - painter = painterResource (id = R.drawable.img_empty_view), + painter = painterResource(id = R.drawable.img_empty_view), contentDescription = null, modifier = Modifier .fillMaxWidth() @@ -284,81 +284,103 @@ fun DateMessageCard( .fillMaxWidth(), ) { Column(modifier = Modifier.fillMaxWidth()) { - Column( + Box( Modifier .background(color = BbangZipTheme.colors.backgroundAccent_FFDAA0, shape = RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp)) .fillMaxWidth() .height(LocalConfiguration.current.screenHeightDp.dp * (172f / 764f)) - .padding(start = 24.dp), ) { - Spacer(modifier = Modifier.height(44.dp)) - - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 8.dp), - ) { - Text( - text = todayDate[0].toInt().toString(), - style = BbangZipTheme.typography.title3Bold, - color = BbangZipTheme.colors.labelNormal_282119, + if (pendingCount == 0) { + Image( + painter = painterResource(R.drawable.img_pending_study_zero), + contentDescription = null, + modifier = Modifier + .fillMaxSize() + .aspectRatio(360f / 172f) ) - - Text( - text = stringResource(R.string.todo_month_text), - style = BbangZipTheme.typography.headline1Bold, - color = BbangZipTheme.colors.labelAlternative_282119_61, + }else{ + Image( + painter = painterResource(R.drawable.img_no_peding_study), + contentDescription = null, + modifier = Modifier + .fillMaxSize() + .aspectRatio(360f / 172f) ) + } + Column( + modifier = Modifier.padding(start = 24.dp), + ) { + Spacer(modifier = Modifier.height(44.dp)) - Spacer(modifier = Modifier.width(8.dp)) + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + if(pendingCount != 0) Spacer(modifier = Modifier.width(8.dp)) + Text( + text = todayDate[0].toInt().toString(), + style = BbangZipTheme.typography.title3Bold, + color = BbangZipTheme.colors.labelNormal_282119, + ) - Text( - text = todayDate[1].toInt().toString(), - style = BbangZipTheme.typography.title3Bold, - color = BbangZipTheme.colors.labelNormal_282119, - ) + Text( + text = stringResource(R.string.todo_month_text), + style = BbangZipTheme.typography.headline1Bold, + color = BbangZipTheme.colors.labelAlternative_282119_61, + ) - Text( - text = stringResource(R.string.todo_day_text), - style = BbangZipTheme.typography.headline1Bold, - color = BbangZipTheme.colors.labelAlternative_282119_61, - ) + Spacer(modifier = Modifier.width(8.dp)) - Spacer(modifier = Modifier.width(8.dp)) + Text( + text = todayDate[1].toInt().toString(), + style = BbangZipTheme.typography.title3Bold, + color = BbangZipTheme.colors.labelNormal_282119, + ) - Text( - text = todayDate[2], - style = BbangZipTheme.typography.body1Bold, - color = BbangZipTheme.colors.labelNormal_282119, - ) - } + Text( + text = stringResource(R.string.todo_day_text), + style = BbangZipTheme.typography.headline1Bold, + color = BbangZipTheme.colors.labelAlternative_282119_61, + ) - Spacer(modifier = modifier.height(8.dp)) + Spacer(modifier = Modifier.width(8.dp)) - if (pendingCount == 0) { - Text( - text = stringResource(R.string.todo_pending_count_text), - style = BbangZipTheme.typography.headline1Bold, - color = BbangZipTheme.colors.labelAlternative_282119_61, - ) + Text( + text = todayDate[2], + style = BbangZipTheme.typography.body1Bold, + color = BbangZipTheme.colors.labelNormal_282119, + ) + } - Spacer(modifier = Modifier.height(62.dp)) - } else { - BbangZipButton( - bbangZipButtonType = BbangZipButtonType.Outlined, - bbangZipButtonSize = BbangZipButtonSize.Medium, - onClick = { onAddPendingStudyButtonClicked() }, - label = String.format(stringResource(R.string.btn_todo_overdue_label), pendingCount), - trailingIcon = R.drawable.ic_chevronright_thick_small_24, - modifier = Modifier.wrapContentSize(), - ) + Spacer(modifier = modifier.height(8.dp)) + + if (pendingCount == 0) { + Text( + text = stringResource(R.string.todo_pending_count_text), + style = BbangZipTheme.typography.headline1Bold, + color = BbangZipTheme.colors.labelAlternative_282119_61, + ) + + Spacer(modifier = Modifier.height(62.dp)) + } else { + BbangZipButton( + bbangZipButtonType = BbangZipButtonType.Outlined, + bbangZipButtonSize = BbangZipButtonSize.Medium, + onClick = { onAddPendingStudyButtonClicked() }, + label = String.format(stringResource(R.string.btn_todo_overdue_label), pendingCount), + trailingIcon = R.drawable.ic_chevronright_thick_small_24, + modifier = Modifier.wrapContentSize(), + ) - Spacer(modifier = Modifier.height(48.dp)) + Spacer(modifier = Modifier.height(48.dp)) + } } } Spacer(modifier = Modifier.height(24.dp)) } + + TopTailBalloon( text = stringResource(R.string.todo_top_tail_balloon_text), leadingIcon = { @@ -749,7 +771,7 @@ fun TodoScreenMockPreview() { ), TodoContract.TodoState( todoList = mockToDoList, - pendingCount = 0, + pendingCount = 2, remainingStudyCount = 2, completeCount = 2, screenType = ToDoScreenType.EMPTY, diff --git a/app/src/main/res/drawable/img_no_peding_study.xml b/app/src/main/res/drawable/img_no_peding_study.xml new file mode 100644 index 00000000..9b1e344a --- /dev/null +++ b/app/src/main/res/drawable/img_no_peding_study.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_pending_study_zero.xml b/app/src/main/res/drawable/img_pending_study_zero.xml new file mode 100644 index 00000000..37c77419 --- /dev/null +++ b/app/src/main/res/drawable/img_pending_study_zero.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + From f400d6b02c79ea07405597469f58ba59a4f15adf Mon Sep 17 00:00:00 2001 From: beom84 Date: Thu, 23 Jan 2025 19:47:42 +0900 Subject: [PATCH 06/25] =?UTF-8?q?[chore]=20#63=20todo=20code=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/todo/TodoScreen.kt | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index 57a6e824..2729f4c2 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -298,7 +298,7 @@ fun DateMessageCard( .fillMaxSize() .aspectRatio(360f / 172f) ) - }else{ + } else { Image( painter = painterResource(R.drawable.img_no_peding_study), contentDescription = null, @@ -309,13 +309,13 @@ fun DateMessageCard( } Column( modifier = Modifier.padding(start = 24.dp), - ) { + ) { Spacer(modifier = Modifier.height(44.dp)) Row( verticalAlignment = Alignment.CenterVertically, ) { - if(pendingCount != 0) Spacer(modifier = Modifier.width(8.dp)) + if (pendingCount != 0) Spacer(modifier = Modifier.width(8.dp)) Text( text = todayDate[0].toInt().toString(), style = BbangZipTheme.typography.title3Bold, @@ -490,22 +490,6 @@ fun DeleteAndFilterIcons( } } -@Composable -fun EmptyView( - modifier: Modifier = Modifier, -) { - Box( - modifier = - modifier - .fillMaxWidth() - .height(328.dp) - .background(color = BbangZipTheme.colors.backgroundAlternative_F5F5F5, shape = RoundedCornerShape(size = 32.dp)), - contentAlignment = Alignment.Center, - ) { - Text(text = "Empty View") - } -} - @OptIn(ExperimentalMaterial3Api::class) @Composable fun BbangZipToDoFilterPickerBottomSheet( @@ -536,6 +520,7 @@ fun BbangZipToDoFilterPickerBottomSheet( modifier = Modifier .fillMaxWidth() + .applyFilterOnClick { onSelectedItemChanged(item) } .background( color = if (item != selectedItem) BbangZipTheme.colors.staticWhite_FFFFFF else BbangZipTheme.colors.fillStrong_68645E_16, From 0c959b73991d1ccefa35c840040022d89f570835 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 03:58:30 +0900 Subject: [PATCH 07/25] =?UTF-8?q?[feat]=20#63=20subject=20category=20?= =?UTF-8?q?=EA=B7=B8=EB=9E=98=ED=94=BD=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybadgecategory/MyBadgeCategoryScreen.kt | 75 ++- .../presentation/ui/subject/SubjectScreen.kt | 10 + .../presentation/ui/todo/TodoScreen.kt | 41 +- .../main/res/drawable/img_mypage_header.xml | 59 ++ .../main/res/drawable/img_subject_header.xml | 607 ++++++++++++++++++ 5 files changed, 746 insertions(+), 46 deletions(-) create mode 100644 app/src/main/res/drawable/img_mypage_header.xml create mode 100644 app/src/main/res/drawable/img_subject_header.xml diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt index 11ec9725..48b0f1fc 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt @@ -1,6 +1,7 @@ package org.android.bbangzip.presentation.ui.my.mybadgecategory import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -27,6 +28,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -57,9 +59,9 @@ fun MyBadgeCategoryScreen( } LazyColumn( modifier = - modifier - .fillMaxWidth() - .background(BbangZipTheme.colors.staticWhite_FFFFFF), + modifier + .fillMaxWidth() + .background(BbangZipTheme.colors.staticWhite_FFFFFF), state = scrollState, ) { stickyHeader { @@ -73,23 +75,36 @@ fun MyBadgeCategoryScreen( } item { - Column( + Box( modifier = - Modifier - .fillMaxWidth() - .background( - color = BbangZipTheme.colors.backgroundAccent_FFDAA0, - shape = RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp), - ), + Modifier + .fillMaxWidth() + .background( + color = BbangZipTheme.colors.backgroundAccent_FFDAA0, + shape = RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp), + ) ) { - Text( - text = stringResource(R.string.badge_category_title, "밍밍"), - style = BbangZipTheme.typography.heading2Bold, - color = BbangZipTheme.colors.labelNormal_282119, + Image( + painter = painterResource(R.drawable.img_mypage_header), + contentDescription = null, + modifier = Modifier + .fillMaxSize() + .aspectRatio(360f / 161f) + ) + Column( modifier = + Modifier + .fillMaxWidth(), + ) { + Text( + text = stringResource(R.string.badge_category_title, "밍밍"), + style = BbangZipTheme.typography.heading2Bold, + color = BbangZipTheme.colors.labelNormal_282119, + modifier = Modifier .padding(start = 24.dp, top = 28.dp, bottom = 48.dp), - ) + ) + } } Spacer(Modifier.height(48.dp)) @@ -157,10 +172,10 @@ fun BadgeCategoryGridList( Column( modifier = - modifier - .padding(horizontal = 20.dp) - .fillMaxWidth() - .background(BbangZipTheme.colors.staticWhite_FFFFFF), + modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() + .background(BbangZipTheme.colors.staticWhite_FFFFFF), ) { Text( text = badgeCategoryTitle, @@ -180,10 +195,10 @@ fun BadgeCategoryGridList( LazyVerticalGrid( modifier = - Modifier - .padding(horizontal = 16.dp) - .fillMaxSize() - .heightIn(max = (badgeHeight * (badgeCategoryList.size - 1 / 3 + 1) + 20 * (badgeCategoryList.size / 3)).dp), + Modifier + .padding(horizontal = 16.dp) + .fillMaxSize() + .heightIn(max = (badgeHeight * (badgeCategoryList.size - 1 / 3 + 1) + 20 * (badgeCategoryList.size / 3)).dp), columns = GridCells.Fixed(3), horizontalArrangement = Arrangement.spacedBy(32.dp), verticalArrangement = Arrangement.spacedBy(20.dp), @@ -191,10 +206,10 @@ fun BadgeCategoryGridList( items(badgeCategoryList.size) { index -> Box( modifier = - Modifier - .aspectRatio(1f) - .clip(RoundedCornerShape(24.dp)) - .clickable { onBadgeCardClicked(badgeCategoryList[index].name) }, + Modifier + .aspectRatio(1f) + .clip(RoundedCornerShape(24.dp)) + .clickable { onBadgeCardClicked(badgeCategoryList[index].name) }, contentAlignment = Alignment.Center, ) { if (badgeCategoryList[index].isLocked) { @@ -206,9 +221,9 @@ fun BadgeCategoryGridList( model = badgeCategoryList[index].imageUrl, contentDescription = null, modifier = - Modifier - .fillMaxSize() - .clip(RoundedCornerShape(24.dp)), + Modifier + .fillMaxSize() + .clip(RoundedCornerShape(24.dp)), ) } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt index 64361bd1..1a7c71bb 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt @@ -1,5 +1,6 @@ package org.android.bbangzip.presentation.ui.subject +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -7,6 +8,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -21,6 +23,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview @@ -74,6 +77,13 @@ fun SubjectScreen( .height(backgroundHeight.dp) .background(color = BbangZipTheme.colors.backgroundAccent_FFDAA0, shape = RoundedCornerShape(bottomStart = 32.dp, bottomEnd = 32.dp)), ) { + Image( + painter = painterResource(R.drawable.img_subject_header), + contentDescription = null, + modifier = Modifier + .fillMaxSize() + .aspectRatio(360f / 220f) + ) Row( modifier = modifier diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index d66e29c4..aae8bbc9 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -1,12 +1,16 @@ package org.android.bbangzip.presentation.ui.todo +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -15,6 +19,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api @@ -26,8 +31,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.android.bbangzip.R @@ -41,7 +48,9 @@ import org.android.bbangzip.presentation.type.BbangZipButtonSize import org.android.bbangzip.presentation.type.BbangZipButtonType import org.android.bbangzip.presentation.type.ToDoFilterType import org.android.bbangzip.presentation.type.ToDoScreenType +import org.android.bbangzip.presentation.ui.subject.subjectdetail.RevertCompleteBottomSheet import org.android.bbangzip.presentation.ui.todo.component.ToDoFilterPickerBottomSheet +import org.android.bbangzip.presentation.util.modifier.applyFilterOnClick import org.android.bbangzip.ui.theme.BbangZipTheme @Composable @@ -66,10 +75,10 @@ fun TodoScreen( ) { Box( modifier = - modifier - .fillMaxSize() - .padding(bottom = bottomPadding.calculateBottomPadding()) - .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), + modifier + .fillMaxSize() + .padding(bottom = bottomPadding.calculateBottomPadding()) + .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), ) { LazyColumn { item { @@ -364,13 +373,12 @@ fun DateMessageCard( modifier = Modifier.wrapContentSize(), ) - Spacer(modifier = Modifier.height(48.dp)) + Spacer(modifier = Modifier.height(48.dp)) + } } } - Spacer(modifier = Modifier.height(24.dp)) } - TopTailBalloon( text = stringResource(R.string.todo_top_tail_balloon_text), leadingIcon = { @@ -441,18 +449,18 @@ fun DeleteAndFilterIcons( ) { Row( modifier = - modifier - .padding(horizontal = 16.dp) - .fillMaxWidth(), + modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { Spacer(modifier = Modifier.weight(1f)) Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onDeleteIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onDeleteIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -465,9 +473,9 @@ fun DeleteAndFilterIcons( Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onFilterIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onFilterIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -759,3 +767,4 @@ fun TodoScreenMockPreview() { bottomPadding = PaddingValues(), ) } + diff --git a/app/src/main/res/drawable/img_mypage_header.xml b/app/src/main/res/drawable/img_mypage_header.xml new file mode 100644 index 00000000..4d8a5260 --- /dev/null +++ b/app/src/main/res/drawable/img_mypage_header.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_subject_header.xml b/app/src/main/res/drawable/img_subject_header.xml new file mode 100644 index 00000000..6341c8fc --- /dev/null +++ b/app/src/main/res/drawable/img_subject_header.xml @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 46630559c8614235a35fa387f97b79467afc34f0 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 04:04:18 +0900 Subject: [PATCH 08/25] =?UTF-8?q?[feat]=20#63=20todo=20=EB=B0=80=EB=A0=B8?= =?UTF-8?q?=EC=9D=84=EB=8C=B8=20graphic=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/todo/TodoScreen.kt | 4 +- .../res/drawable/img_pending_study_zero.xml | 134 ------------------ .../img_pending_study_zero_header.xml | 45 ++++++ 3 files changed, 47 insertions(+), 136 deletions(-) delete mode 100644 app/src/main/res/drawable/img_pending_study_zero.xml create mode 100644 app/src/main/res/drawable/img_pending_study_zero_header.xml diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index aae8bbc9..db09ab00 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -290,11 +290,11 @@ fun DateMessageCard( Modifier .background(color = BbangZipTheme.colors.backgroundAccent_FFDAA0, shape = RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp)) .fillMaxWidth() - .height(LocalConfiguration.current.screenHeightDp.dp * (172f / 764f)) + .height(LocalConfiguration.current.screenHeightDp.dp * (172f / 800f)) ) { if (pendingCount == 0) { Image( - painter = painterResource(R.drawable.img_pending_study_zero), + painter = painterResource(R.drawable.img_pending_study_zero_header), contentDescription = null, modifier = Modifier .fillMaxSize() diff --git a/app/src/main/res/drawable/img_pending_study_zero.xml b/app/src/main/res/drawable/img_pending_study_zero.xml deleted file mode 100644 index 37c77419..00000000 --- a/app/src/main/res/drawable/img_pending_study_zero.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/img_pending_study_zero_header.xml b/app/src/main/res/drawable/img_pending_study_zero_header.xml new file mode 100644 index 00000000..be207e01 --- /dev/null +++ b/app/src/main/res/drawable/img_pending_study_zero_header.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + From e934aefa435ddb6e44fa73541b6c50724eddd8a6 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 04:13:21 +0900 Subject: [PATCH 09/25] =?UTF-8?q?[feat]=20#63=20graphic=20clip=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/bbangzip/presentation/ui/todo/TodoScreen.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index db09ab00..1838e095 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -297,15 +297,16 @@ fun DateMessageCard( painter = painterResource(R.drawable.img_pending_study_zero_header), contentDescription = null, modifier = Modifier - .fillMaxSize() + .fillMaxWidth() .aspectRatio(360f / 172f) + .clip(RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp)), ) } else { Image( painter = painterResource(R.drawable.img_no_peding_study), contentDescription = null, modifier = Modifier - .fillMaxSize() + .fillMaxWidth() .aspectRatio(360f / 172f) ) } @@ -754,7 +755,7 @@ fun TodoScreenMockPreview() { ), TodoContract.TodoState( todoList = mockToDoList, - pendingCount = 2, + pendingCount = 0, remainingStudyCount = 2, completeCount = 2, screenType = ToDoScreenType.EMPTY, From e6027182ba2637532dc41ef6225384438f64cdcb Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 13:06:59 +0900 Subject: [PATCH 10/25] =?UTF-8?q?[feat]=20#70=20=EA=B3=BC=EB=AA=A9=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0=20API=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/SubjectRemoteDataSource.kt | 12 ++++-- .../data/dto/request/RequestAddSubjectsDto.kt | 12 ++++++ .../remote/SubjectRepositoryImpl.kt | 40 +++++++++++++------ .../org/android/bbangzip/di/UseCaseModule.kt | 12 ++++++ .../repository/remote/SubjectRepository.kt | 5 +++ .../usecase/PostAddSubjectNameUseCase.kt | 10 +++++ 6 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt create mode 100644 app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt diff --git a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt index 427af160..6746fec1 100644 --- a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt +++ b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt @@ -6,7 +6,11 @@ import org.android.bbangzip.data.util.base.BaseResponse import javax.inject.Inject class SubjectRemoteDataSource - @Inject - constructor(private val subjectService: SubjectService) { - suspend fun getSubjectInfo(): BaseResponse = subjectService.getSubjectInfo() - } +@Inject +constructor(private val subjectService: SubjectService) { + suspend fun getSubjectInfo(): BaseResponse = subjectService.getSubjectInfo() + + suspend fun postSubjectName(): BaseResponse = subjectService.postSubjectName() + + suspend fun deleteSubjects(): BaseResponse = subjectService.deleteSubjects() +} diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt new file mode 100644 index 00000000..b56b3115 --- /dev/null +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt @@ -0,0 +1,12 @@ +package org.android.bbangzip.data.dto.request + +import kotlinx.serialization.SerialName + +data class RequestAddSubjectsDto( + @SerialName("subjectName") + val subjectName: String, + @SerialName("year") + val year: Int, + @SerialName("semester") + val semester: String +) diff --git a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt index fb3aa41b..59e9b285 100644 --- a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt +++ b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt @@ -6,16 +6,30 @@ import org.android.bbangzip.domain.repository.remote.SubjectRepository import javax.inject.Inject class SubjectRepositoryImpl - @Inject - constructor( - private val subjectRemoteDataSource: SubjectRemoteDataSource, - ) : SubjectRepository { - override suspend fun getSubjectInfo(): Result = - runCatching { - val response = subjectRemoteDataSource.getSubjectInfo() - - val responseData = response.data ?: throw IllegalStateException(response.message ?: "Null Error") - - responseData.toSubjectInfoEntity() - } - } +@Inject +constructor( + private val subjectRemoteDataSource: SubjectRemoteDataSource, +) : SubjectRepository { + override suspend fun getSubjectInfo(): Result = + runCatching { + val response = subjectRemoteDataSource.getSubjectInfo() + + val responseData = response.data ?: throw IllegalStateException(response.message ?: "Null Error") + + responseData.toSubjectInfoEntity() + } + + override suspend fun postSubjectName(): Result = + runCatching { + val response = subjectRemoteDataSource.postSubjectName() + + response.data ?: throw IllegalStateException(response.message ?: "Null Error") + } + + override suspend fun deleteSubjects(): Result = + runCatching { + val response = subjectRemoteDataSource.deleteSubjects() + + response.data ?: throw IllegalStateException(response.message ?: "Null Error") + } +} diff --git a/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt b/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt index c1317c64..25685ad4 100644 --- a/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt +++ b/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt @@ -11,6 +11,7 @@ import org.android.bbangzip.domain.repository.remote.PieceRepository import org.android.bbangzip.domain.repository.remote.SubjectRepository import org.android.bbangzip.domain.repository.remote.UserRepository import org.android.bbangzip.domain.usecase.DeleteLogoutUseCase +import org.android.bbangzip.domain.usecase.DeleteSubjectsUseCase import org.android.bbangzip.domain.usecase.DeleteWithdrawUseCase import org.android.bbangzip.domain.usecase.FetchBbangZipUseCase import org.android.bbangzip.domain.usecase.FetchDummyUseCase @@ -20,6 +21,7 @@ import org.android.bbangzip.domain.usecase.GetBadgeDetailUseCase import org.android.bbangzip.domain.usecase.GetSubjectDetailUseCase import org.android.bbangzip.domain.usecase.GetSubjectInfoUseCase import org.android.bbangzip.domain.usecase.GetToInfoUseCase +import org.android.bbangzip.domain.usecase.PostAddSubjectNameUseCase import org.android.bbangzip.domain.usecase.PostAddTodoItemListUseCase import org.android.bbangzip.domain.usecase.PostCompleteCardIdUseCase import org.android.bbangzip.domain.usecase.PostDeletedItemListUseCase @@ -104,4 +106,14 @@ class UseCaseModule { @Singleton fun providesGetSubjectInfoUseCase(subjectRepository: SubjectRepository): GetSubjectInfoUseCase = GetSubjectInfoUseCase(subjectRepository = subjectRepository) + + @Provides + @Singleton + fun providesPostAddSubjectNameUseCase(subjectRepository: SubjectRepository): PostAddSubjectNameUseCase = + PostAddSubjectNameUseCase(subjectRepository = subjectRepository) + + @Provides + @Singleton + fun providesDeleteSubjectsUseCase(subjectRepository: SubjectRepository): DeleteSubjectsUseCase = + DeleteSubjectsUseCase(subjectRepository = subjectRepository) } diff --git a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt index c334c9e8..701cc935 100644 --- a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt +++ b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt @@ -1,7 +1,12 @@ package org.android.bbangzip.domain.repository.remote +import org.android.bbangzip.data.util.base.BaseResponse import org.android.bbangzip.domain.model.SubjectInfoEntity interface SubjectRepository { suspend fun getSubjectInfo(): Result + + suspend fun postSubjectName(): Result + + suspend fun deleteSubjects(): Result } diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt new file mode 100644 index 00000000..73b52dd3 --- /dev/null +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt @@ -0,0 +1,10 @@ +package org.android.bbangzip.domain.usecase + +import org.android.bbangzip.domain.repository.remote.SubjectRepository + +class PostAddSubjectNameUseCase ( + private val subjectRepository: SubjectRepository +){ + suspend operator fun invoke(): Result = + subjectRepository.postSubjectName() +} \ No newline at end of file From dc1fae270b594693055d4a64d58dd71e5ffc659b Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 13:07:04 +0900 Subject: [PATCH 11/25] =?UTF-8?q?[feat]=20#70=20=EA=B3=BC=EB=AA=A9=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=ED=95=98=EA=B8=B0=20API=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/RequestDeleteSubjectsDto.kt | 11 +++++++ .../bbangzip/data/service/SubjectService.kt | 8 +++++ .../domain/usecase/DeleteSubjectsUseCase.kt | 10 ++++++ .../ui/subject/SubjectContract.kt | 2 ++ .../ui/subject/SubjectViewModel.kt | 31 +++++++++++++++++++ 5 files changed, 62 insertions(+) create mode 100644 app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt create mode 100644 app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt new file mode 100644 index 00000000..817182e6 --- /dev/null +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt @@ -0,0 +1,11 @@ +package org.android.bbangzip.data.dto.request + +import kotlinx.serialization.SerialName + +data class RequestDeleteSubjectsDto( + @SerialName("subjectIds") + val subjectIds: List, + @SerialName("year") + val year: Int, + @SerialName("semester") + val semester: String) diff --git a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt index 39ca9c63..adc577aa 100644 --- a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt +++ b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt @@ -2,9 +2,17 @@ package org.android.bbangzip.data.service import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto import org.android.bbangzip.data.util.base.BaseResponse +import retrofit2.http.DELETE import retrofit2.http.GET +import retrofit2.http.POST interface SubjectService { @GET("/api/v1/subjects/filter?year=2025&semester=1학기") suspend fun getSubjectInfo(): BaseResponse + + @POST("/api/v1/subjects") + suspend fun postSubjectName(): BaseResponse + + @DELETE("/api/v1/subjects") + suspend fun deleteSubjects(): BaseResponse } diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt new file mode 100644 index 00000000..06ad6a90 --- /dev/null +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt @@ -0,0 +1,10 @@ +package org.android.bbangzip.domain.usecase + +import org.android.bbangzip.domain.repository.remote.SubjectRepository + +class DeleteSubjectsUseCase( + private val subjectRepository: SubjectRepository +) { + suspend operator fun invoke(): Result = + subjectRepository.deleteSubjects() +} \ No newline at end of file diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt index 263926e6..ceeee1f7 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt @@ -40,6 +40,8 @@ class SubjectContract { data class UpdateSubjectCardList(val subjectList: List) : SubjectReduce data class UpdateDeletedSet(val subjectId: Int) : SubjectReduce + + data object RestoreDeletedSet : SubjectReduce } sealed interface SubjectSideEffect : BaseContract.SideEffect { diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt index 828d2d9a..900e95c8 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt @@ -3,7 +3,9 @@ package org.android.bbangzip.presentation.ui.subject import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import dagger.hilt.android.lifecycle.HiltViewModel +import org.android.bbangzip.domain.usecase.DeleteSubjectsUseCase import org.android.bbangzip.domain.usecase.GetSubjectInfoUseCase +import org.android.bbangzip.domain.usecase.PostAddSubjectNameUseCase import org.android.bbangzip.presentation.component.card.BbangZipCardState import org.android.bbangzip.presentation.model.card.SubjectCardModel import org.android.bbangzip.presentation.type.CardViewType @@ -16,6 +18,8 @@ class SubjectViewModel @Inject constructor( private val getSubjectInfoUseCase: GetSubjectInfoUseCase, + private val deleteSubjectsUseCase: DeleteSubjectsUseCase, + private val postAddSubjectNameUseCase: PostAddSubjectNameUseCase, savedStateHandle: SavedStateHandle, ) : BaseViewModel( savedStateHandle = savedStateHandle, @@ -124,6 +128,12 @@ class SubjectViewModel subjectList = reduce.subjectList, ) } + + is SubjectContract.SubjectReduce.RestoreDeletedSet -> { + state.copy( + subjectSetToDelete = setOf(), + ) + } } } @@ -158,4 +168,25 @@ class SubjectViewModel Timber.tag("SubjectInfo").d(error) } } + + private suspend fun deleteSubjects() { + deleteSubjectsUseCase() + .onSuccess { + updateState(SubjectContract.SubjectReduce.UpdateToDefaultMode) + getSubjectInfo() + } + .onFailure { error -> + Timber.tag("이승범").d(error) + } + } + + private suspend fun postAddSubjectName() { + postAddSubjectNameUseCase() + .onSuccess { + Timber.tag("AddSubject").d("AddSubjectName 성공") + } + .onFailure { error -> + Timber.tag("이승범").d(error) + } + } } From b46c9c68d05e7f13feb1e9d226b119c9d63eb621 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 13:31:17 +0900 Subject: [PATCH 12/25] =?UTF-8?q?[feat]=20#70=20=EA=B3=BC=EB=AA=A9?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95=ED=95=98=EA=B8=B0=20API=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/SubjectRemoteDataSource.kt | 7 +++++++ .../data/dto/request/RequestSubjectOptions.kt | 8 ++++++++ .../remote/SubjectRepositoryImpl.kt | 8 ++++++++ .../bbangzip/data/service/SubjectService.kt | 11 +++++++++++ .../repository/remote/SubjectRepository.kt | 7 +++++++ .../usecase/PutSubjectOptionsUseCase.kt | 19 +++++++++++++++++++ 6 files changed, 60 insertions(+) create mode 100644 app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt create mode 100644 app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt diff --git a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt index 6746fec1..71cd16f7 100644 --- a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt +++ b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt @@ -1,5 +1,6 @@ package org.android.bbangzip.data.datasource.remote +import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto import org.android.bbangzip.data.service.SubjectService import org.android.bbangzip.data.util.base.BaseResponse @@ -13,4 +14,10 @@ constructor(private val subjectService: SubjectService) { suspend fun postSubjectName(): BaseResponse = subjectService.postSubjectName() suspend fun deleteSubjects(): BaseResponse = subjectService.deleteSubjects() + + suspend fun putSubjectOptions( + subjectId: Int, + options: String, + requestSubjectOptions: RequestSubjectOptions + ): BaseResponse = subjectService.putSubjectOptions(subjectId, options, requestSubjectOptions) } diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt new file mode 100644 index 00000000..5a810cda --- /dev/null +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt @@ -0,0 +1,8 @@ +package org.android.bbangzip.data.dto.request + +import kotlinx.serialization.SerialName + +data class RequestSubjectOptions( + @SerialName("value") + val value: String +) \ No newline at end of file diff --git a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt index 59e9b285..19452a38 100644 --- a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt +++ b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt @@ -1,6 +1,7 @@ package org.android.bbangzip.data.repositoryImpl.remote import org.android.bbangzip.data.datasource.remote.SubjectRemoteDataSource +import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.domain.model.SubjectInfoEntity import org.android.bbangzip.domain.repository.remote.SubjectRepository import javax.inject.Inject @@ -30,6 +31,13 @@ constructor( runCatching { val response = subjectRemoteDataSource.deleteSubjects() + response.data ?: throw IllegalStateException(response.message ?: "Null Error") + } + + override suspend fun putSubjectOptions(subjectId: Int, options: String, requestSubjectOptions: RequestSubjectOptions): Result = + runCatching { + val response = subjectRemoteDataSource.putSubjectOptions(subjectId, options, requestSubjectOptions) + response.data ?: throw IllegalStateException(response.message ?: "Null Error") } } diff --git a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt index adc577aa..b8e33a31 100644 --- a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt +++ b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt @@ -1,10 +1,14 @@ package org.android.bbangzip.data.service +import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto import org.android.bbangzip.data.util.base.BaseResponse +import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Path interface SubjectService { @GET("/api/v1/subjects/filter?year=2025&semester=1학기") @@ -15,4 +19,11 @@ interface SubjectService { @DELETE("/api/v1/subjects") suspend fun deleteSubjects(): BaseResponse + + @PUT("/api/v1/subjects/{subjectId}/{options}") + suspend fun putSubjectOptions( + @Path("subjectId") subjectId: Int, + @Path("options") options: String, + @Body requestSubjectOptions: RequestSubjectOptions + ): BaseResponse } diff --git a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt index 701cc935..0fbb1822 100644 --- a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt +++ b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt @@ -1,5 +1,6 @@ package org.android.bbangzip.domain.repository.remote +import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.data.util.base.BaseResponse import org.android.bbangzip.domain.model.SubjectInfoEntity @@ -9,4 +10,10 @@ interface SubjectRepository { suspend fun postSubjectName(): Result suspend fun deleteSubjects(): Result + + suspend fun putSubjectOptions( + subjectId: Int, + options: String, + requestSubjectOptions: RequestSubjectOptions + ): Result } diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt new file mode 100644 index 00000000..d23d115a --- /dev/null +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt @@ -0,0 +1,19 @@ +package org.android.bbangzip.domain.usecase + +import org.android.bbangzip.data.dto.request.RequestSubjectOptions +import org.android.bbangzip.domain.repository.remote.SubjectRepository + +class PutSubjectOptionsUseCase( + private val subjectRepository: SubjectRepository +) { + suspend operator fun invoke( + subjectId: Int, + options: String, + requestSubjectOptions: RequestSubjectOptions + ): Result = + subjectRepository.putSubjectOptions( + subjectId = subjectId, + options = options, + requestSubjectOptions = requestSubjectOptions + ) +} \ No newline at end of file From 518968727aba8d719f07f742d01d05a524998586 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 14:08:57 +0900 Subject: [PATCH 13/25] =?UTF-8?q?[feat]=20#70=20subjectDetail=20graphic=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybadgecategory/MyBadgeCategoryScreen.kt | 2 +- .../subjectdetail/SubjectDetatilScreen.kt | 13 ++ .../presentation/ui/todo/TodoScreen.kt | 4 +- .../main/res/drawable/img_mypage_header.xml | 24 ++-- .../res/drawable/img_pending_study_zero.xml | 134 ++++++++++++++++++ ...ader.xml => img_subject_detail_header.xml} | 0 6 files changed, 161 insertions(+), 16 deletions(-) create mode 100644 app/src/main/res/drawable/img_pending_study_zero.xml rename app/src/main/res/drawable/{img_pending_study_zero_header.xml => img_subject_detail_header.xml} (100%) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt index 48b0f1fc..0a46f3ce 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt @@ -89,7 +89,7 @@ fun MyBadgeCategoryScreen( contentDescription = null, modifier = Modifier .fillMaxSize() - .aspectRatio(360f / 161f) + .aspectRatio(360f / 121f) ) Column( modifier = diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index 0904f15a..a497562f 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -1,5 +1,6 @@ package org.android.bbangzip.presentation.ui.subject.subjectdetail +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement @@ -8,6 +9,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -32,8 +34,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.AnnotatedString @@ -117,6 +121,15 @@ fun SubjectDetailScreen( shape = RoundedCornerShape(bottomStart = 32.dp, bottomEnd = 32.dp), ), ) { + Image( + painter = painterResource(R.drawable.img_subject_detail_header), + contentDescription = null, + modifier = Modifier + .fillMaxSize() + .aspectRatio(360f / 172f) + .clip(shape = RoundedCornerShape(bottomStart = 40.dp, bottomEnd = 40.dp)) + .align(Alignment.BottomCenter), + ) TwoLineTextWithWordWrap(motivationMessage) Box( diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index 1838e095..1c1f43d2 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -48,8 +48,6 @@ import org.android.bbangzip.presentation.type.BbangZipButtonSize import org.android.bbangzip.presentation.type.BbangZipButtonType import org.android.bbangzip.presentation.type.ToDoFilterType import org.android.bbangzip.presentation.type.ToDoScreenType -import org.android.bbangzip.presentation.ui.subject.subjectdetail.RevertCompleteBottomSheet -import org.android.bbangzip.presentation.ui.todo.component.ToDoFilterPickerBottomSheet import org.android.bbangzip.presentation.util.modifier.applyFilterOnClick import org.android.bbangzip.ui.theme.BbangZipTheme @@ -294,7 +292,7 @@ fun DateMessageCard( ) { if (pendingCount == 0) { Image( - painter = painterResource(R.drawable.img_pending_study_zero_header), + painter = painterResource(R.drawable.img_pending_study_zero), contentDescription = null, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/res/drawable/img_mypage_header.xml b/app/src/main/res/drawable/img_mypage_header.xml index 4d8a5260..9297de8c 100644 --- a/app/src/main/res/drawable/img_mypage_header.xml +++ b/app/src/main/res/drawable/img_mypage_header.xml @@ -1,20 +1,20 @@ + android:viewportHeight="132"> diff --git a/app/src/main/res/drawable/img_pending_study_zero.xml b/app/src/main/res/drawable/img_pending_study_zero.xml new file mode 100644 index 00000000..3f26a46c --- /dev/null +++ b/app/src/main/res/drawable/img_pending_study_zero.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/img_pending_study_zero_header.xml b/app/src/main/res/drawable/img_subject_detail_header.xml similarity index 100% rename from app/src/main/res/drawable/img_pending_study_zero_header.xml rename to app/src/main/res/drawable/img_subject_detail_header.xml From 265815042f9e10d9d8a5c54dde24e501a3b7c9f0 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 14:15:08 +0900 Subject: [PATCH 14/25] =?UTF-8?q?[feat]=20#70=20subjectDetail=20graphic=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/subject/subjectdetail/SubjectDetatilScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index b3f7123e..8d4ec5aa 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -123,13 +123,14 @@ fun SubjectDetailScreen( .height(backgroundHeight.dp) .background( color = BbangZipTheme.colors.backgroundAccent_FFDAA0, - shape = RoundedCornerShape(bottomStart = 32.dp, bottomEnd = 32.dp), + shape = RoundedCornerShape(bottomStart = 40.dp, bottomEnd = 40.dp), ), ) { Image( painter = painterResource(R.drawable.img_subject_detail_header), contentDescription = null, modifier = Modifier + .padding(top = 60.dp) .fillMaxSize() .aspectRatio(360f / 172f) .clip(shape = RoundedCornerShape(bottomStart = 40.dp, bottomEnd = 40.dp)) From 9e7d597968908247f9dff7247ab401e0d264df10 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 14:17:24 +0900 Subject: [PATCH 15/25] =?UTF-8?q?[chore]=20#70=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/component/card/FriendCard.kt | 11 +- .../model/card/FriendCardModel.kt | 4 +- .../presentation/ui/friend/FriendContract.kt | 14 +- .../presentation/ui/friend/FriendScreen.kt | 2 +- .../mybadgecategory/MyBadgeCategoryScreen.kt | 63 ++++---- .../onboardingend/OnboardingEndScreen.kt | 33 ++-- .../onboardingstart/OnboardingStartScreen.kt | 20 +-- .../presentation/ui/subject/SubjectScreen.kt | 7 +- .../subjectdetail/SubjectDetatilScreen.kt | 13 +- .../presentation/ui/todo/TodoScreen.kt | 141 +++++++++--------- 10 files changed, 156 insertions(+), 152 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt b/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt index d09f3c82..b9d752a1 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/component/card/FriendCard.kt @@ -73,11 +73,12 @@ fun FriendCard( painter = painterResource(id = data.imgSrc), contentDescription = null, contentScale = ContentScale.FillBounds, - modifier = Modifier.size(48.dp).clip(CircleShape).border( - width = 1.dp, - color = BbangZipTheme.colors.lineNormal_68645E_22, - shape = CircleShape, - ), + modifier = + Modifier.size(48.dp).clip(CircleShape).border( + width = 1.dp, + color = BbangZipTheme.colors.lineNormal_68645E_22, + shape = CircleShape, + ), ) Spacer(modifier = Modifier.width(16.dp)) diff --git a/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt b/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt index fb50c24e..61d405f8 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/model/card/FriendCardModel.kt @@ -11,5 +11,5 @@ data class FriendCardModel( val friendName: String, val imageUrl: String, val state: BbangZipCardState, - @DrawableRes val imgSrc : Int = 0, - ) : Parcelable + @DrawableRes val imgSrc: Int = 0, +) : Parcelable diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt index 26b5c8d0..2d919caf 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendContract.kt @@ -18,49 +18,49 @@ class FriendContract { friendName = "이승범", imageUrl = "https://example.com/alice.jpg", state = BbangZipCardState.DEFAULT, - imgSrc = R.drawable.img_friend_profile_1 + imgSrc = R.drawable.img_friend_profile_1, ), FriendCardModel( friendId = 2, friendName = "김재민", imageUrl = "https://example.com/bob.jpg", state = BbangZipCardState.DEFAULT, - imgSrc = R.drawable.img_friend_profile_2 + imgSrc = R.drawable.img_friend_profile_2, ), FriendCardModel( friendId = 3, friendName = "하지은", imageUrl = "https://example.com/charlie.jpg", state = BbangZipCardState.DEFAULT, - imgSrc = R.drawable.img_friend_profile_3 + imgSrc = R.drawable.img_friend_profile_3, ), FriendCardModel( friendId = 4, friendName = "신우연", imageUrl = "https://example.com/alice.jpg", state = BbangZipCardState.DEFAULT, - imgSrc = R.drawable.img_friend_profile_4 + imgSrc = R.drawable.img_friend_profile_4, ), FriendCardModel( friendId = 5, friendName = "김재민", imageUrl = "https://example.com/bob.jpg", state = BbangZipCardState.DEFAULT, - imgSrc = R.drawable.img_friend_profile_1 + imgSrc = R.drawable.img_friend_profile_1, ), FriendCardModel( friendId = 6, friendName = "하지은", imageUrl = "https://example.com/charlie.jpg", state = BbangZipCardState.DEFAULT, - imgSrc = R.drawable.img_friend_profile_2 + imgSrc = R.drawable.img_friend_profile_2, ), FriendCardModel( friendId = 7, friendName = "이승범", imageUrl = "https://example.com/alice.jpg", state = BbangZipCardState.DEFAULT, - imgSrc = R.drawable.img_friend_profile_3 + imgSrc = R.drawable.img_friend_profile_3, ), ), val menuFilterType: FriendMenuType = FriendMenuType.ALL, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt index 8a1650e8..116f28ae 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/friend/FriendScreen.kt @@ -124,7 +124,7 @@ fun FriendScreen( modifier = Modifier .fillMaxWidth() - .padding(bottom=24.dp, start = 24.dp, end = 24.dp), + .padding(bottom = 24.dp, start = 24.dp, end = 24.dp), ) { Text( text = stringResource(R.string.friend_boss_count, friendState.friendList.size), diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt index 0a46f3ce..86f5ac9d 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/my/mybadgecategory/MyBadgeCategoryScreen.kt @@ -59,9 +59,9 @@ fun MyBadgeCategoryScreen( } LazyColumn( modifier = - modifier - .fillMaxWidth() - .background(BbangZipTheme.colors.staticWhite_FFFFFF), + modifier + .fillMaxWidth() + .background(BbangZipTheme.colors.staticWhite_FFFFFF), state = scrollState, ) { stickyHeader { @@ -77,32 +77,33 @@ fun MyBadgeCategoryScreen( item { Box( modifier = - Modifier - .fillMaxWidth() - .background( - color = BbangZipTheme.colors.backgroundAccent_FFDAA0, - shape = RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp), - ) + Modifier + .fillMaxWidth() + .background( + color = BbangZipTheme.colors.backgroundAccent_FFDAA0, + shape = RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp), + ), ) { Image( painter = painterResource(R.drawable.img_mypage_header), contentDescription = null, - modifier = Modifier - .fillMaxSize() - .aspectRatio(360f / 121f) + modifier = + Modifier + .fillMaxSize() + .aspectRatio(360f / 121f), ) Column( modifier = - Modifier - .fillMaxWidth(), + Modifier + .fillMaxWidth(), ) { Text( text = stringResource(R.string.badge_category_title, "밍밍"), style = BbangZipTheme.typography.heading2Bold, color = BbangZipTheme.colors.labelNormal_282119, modifier = - Modifier - .padding(start = 24.dp, top = 28.dp, bottom = 48.dp), + Modifier + .padding(start = 24.dp, top = 28.dp, bottom = 48.dp), ) } } @@ -172,10 +173,10 @@ fun BadgeCategoryGridList( Column( modifier = - modifier - .padding(horizontal = 20.dp) - .fillMaxWidth() - .background(BbangZipTheme.colors.staticWhite_FFFFFF), + modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() + .background(BbangZipTheme.colors.staticWhite_FFFFFF), ) { Text( text = badgeCategoryTitle, @@ -195,10 +196,10 @@ fun BadgeCategoryGridList( LazyVerticalGrid( modifier = - Modifier - .padding(horizontal = 16.dp) - .fillMaxSize() - .heightIn(max = (badgeHeight * (badgeCategoryList.size - 1 / 3 + 1) + 20 * (badgeCategoryList.size / 3)).dp), + Modifier + .padding(horizontal = 16.dp) + .fillMaxSize() + .heightIn(max = (badgeHeight * (badgeCategoryList.size - 1 / 3 + 1) + 20 * (badgeCategoryList.size / 3)).dp), columns = GridCells.Fixed(3), horizontalArrangement = Arrangement.spacedBy(32.dp), verticalArrangement = Arrangement.spacedBy(20.dp), @@ -206,10 +207,10 @@ fun BadgeCategoryGridList( items(badgeCategoryList.size) { index -> Box( modifier = - Modifier - .aspectRatio(1f) - .clip(RoundedCornerShape(24.dp)) - .clickable { onBadgeCardClicked(badgeCategoryList[index].name) }, + Modifier + .aspectRatio(1f) + .clip(RoundedCornerShape(24.dp)) + .clickable { onBadgeCardClicked(badgeCategoryList[index].name) }, contentAlignment = Alignment.Center, ) { if (badgeCategoryList[index].isLocked) { @@ -221,9 +222,9 @@ fun BadgeCategoryGridList( model = badgeCategoryList[index].imageUrl, contentDescription = null, modifier = - Modifier - .fillMaxSize() - .clip(RoundedCornerShape(24.dp)), + Modifier + .fillMaxSize() + .clip(RoundedCornerShape(24.dp)), ) } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt index c2136e7c..a7ac1aaa 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingend/OnboardingEndScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -31,9 +30,9 @@ fun OnboardingEndScreen( ) { Column( modifier = - Modifier - .fillMaxWidth() - .background(color = BbangZipTheme.colors.backgroundNormal_FFFFFF), + Modifier + .fillMaxWidth() + .background(color = BbangZipTheme.colors.backgroundNormal_FFFFFF), ) { BbangZipBaseTopBar( leadingIcon = R.drawable.ic_chevronleft_thick_small_24, @@ -43,30 +42,30 @@ fun OnboardingEndScreen( Text( text = stringResource(id = R.string.onboarding_final_title), modifier = - Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp) - .padding(top = (LocalConfiguration.current.screenHeightDp * 0.081).dp), + Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp) + .padding(top = (LocalConfiguration.current.screenHeightDp * 0.081).dp), style = BbangZipTheme.typography.title2Bold, color = BbangZipTheme.colors.labelNormal_282119, ) Spacer(modifier = Modifier.height(32.dp)) - Image( painter = painterResource(id = R.drawable.img_onboarding_end), - modifier = Modifier - .fillMaxWidth() - .aspectRatio(8f / 9f), + modifier = + Modifier + .fillMaxWidth() + .aspectRatio(8f / 9f), contentDescription = null, ) Spacer(modifier = Modifier.weight(1f)) - BbangZipButton( - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, bottom = 16.dp), + modifier = + Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, bottom = 16.dp), bbangZipButtonType = BbangZipButtonType.Solid, bbangZipButtonSize = BbangZipButtonSize.Large, onClick = { onClickNextBtn() }, @@ -80,4 +79,4 @@ fun OnboardingEndScreen( @Composable private fun OnboardingEndScreenPreview() { OnboardingEndScreen() -} \ No newline at end of file +} diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt index bb62b038..0f994e1f 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/onboarding/onboardingstart/OnboardingStartScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -30,16 +29,16 @@ fun OnboardingStartScreen( ) { Column( modifier = - Modifier - .fillMaxSize() - .padding(start = 16.dp, end = 16.dp, bottom = 16.dp), + Modifier + .fillMaxSize() + .padding(start = 16.dp, end = 16.dp, bottom = 16.dp), ) { Text( text = stringResource(id = R.string.onboarding_start_title), modifier = - Modifier - .fillMaxWidth() - .padding(top = (LocalConfiguration.current.screenHeightDp * 0.15).dp), + Modifier + .fillMaxWidth() + .padding(top = (LocalConfiguration.current.screenHeightDp * 0.15).dp), style = BbangZipTheme.typography.title2Bold, color = BbangZipTheme.colors.labelNormal_282119, ) @@ -49,9 +48,10 @@ fun OnboardingStartScreen( Image( painter = painterResource(id = R.drawable.img_onboarding_start), contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .aspectRatio(8f / 9f) + modifier = + Modifier + .fillMaxWidth() + .aspectRatio(8f / 9f), ) Spacer(modifier = Modifier.weight(1f)) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt index a7945c6f..eed64b46 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt @@ -81,9 +81,10 @@ fun SubjectScreen( Image( painter = painterResource(R.drawable.img_subject_header), contentDescription = null, - modifier = Modifier - .fillMaxSize() - .aspectRatio(360f / 220f) + modifier = + Modifier + .fillMaxSize() + .aspectRatio(360f / 220f), ) Row( modifier = diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index 8d4ec5aa..c71177dc 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -129,12 +129,13 @@ fun SubjectDetailScreen( Image( painter = painterResource(R.drawable.img_subject_detail_header), contentDescription = null, - modifier = Modifier - .padding(top = 60.dp) - .fillMaxSize() - .aspectRatio(360f / 172f) - .clip(shape = RoundedCornerShape(bottomStart = 40.dp, bottomEnd = 40.dp)) - .align(Alignment.BottomCenter), + modifier = + Modifier + .padding(top = 60.dp) + .fillMaxSize() + .aspectRatio(360f / 172f) + .clip(shape = RoundedCornerShape(bottomStart = 40.dp, bottomEnd = 40.dp)) + .align(Alignment.BottomCenter), ) TwoLineTextWithWordWrap(motivationMessage) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt index 1c1f43d2..2e47ee99 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/todo/TodoScreen.kt @@ -73,10 +73,10 @@ fun TodoScreen( ) { Box( modifier = - modifier - .fillMaxSize() - .padding(bottom = bottomPadding.calculateBottomPadding()) - .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), + modifier + .fillMaxSize() + .padding(bottom = bottomPadding.calculateBottomPadding()) + .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), ) { LazyColumn { item { @@ -95,9 +95,10 @@ fun TodoScreen( Image( painter = painterResource(id = R.drawable.img_empty_view), contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .aspectRatio(16f / 15f) + modifier = + Modifier + .fillMaxWidth() + .aspectRatio(16f / 15f), ) Spacer(modifier = Modifier.height(16.dp)) @@ -136,10 +137,10 @@ fun TodoScreen( item { Box( modifier = - Modifier - .padding(start = 24.dp) - .fillMaxWidth() - .height(58.dp), + Modifier + .padding(start = 24.dp) + .fillMaxWidth() + .height(58.dp), contentAlignment = Alignment.CenterStart, ) { Text( @@ -153,18 +154,18 @@ fun TodoScreen( Row( modifier = - Modifier - .padding(horizontal = 16.dp) - .fillMaxWidth(), + Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { Spacer(modifier = Modifier.weight(1f)) Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onCloseIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onCloseIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -243,11 +244,11 @@ fun TodoScreen( onClick = { onItemDeleteButtonClicked() }, label = stringResource(R.string.todo_delete_screen_delete_button_text, todoState.selectedItemList.size), modifier = - Modifier - .padding(horizontal = 16.dp) - .fillMaxWidth() - .align(Alignment.BottomCenter) - .padding(bottom = 16.dp), + Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth() + .align(Alignment.BottomCenter) + .padding(bottom = 16.dp), isEnable = todoState.selectedItemList.isNotEmpty(), trailingIcon = R.drawable.ic_trash_default_24, ) @@ -280,32 +281,34 @@ fun DateMessageCard( ) { Box( modifier = - modifier - .fillMaxWidth(), + modifier + .fillMaxWidth(), ) { Column(modifier = Modifier.fillMaxWidth()) { Box( Modifier .background(color = BbangZipTheme.colors.backgroundAccent_FFDAA0, shape = RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp)) .fillMaxWidth() - .height(LocalConfiguration.current.screenHeightDp.dp * (172f / 800f)) + .height(LocalConfiguration.current.screenHeightDp.dp * (172f / 800f)), ) { if (pendingCount == 0) { Image( painter = painterResource(R.drawable.img_pending_study_zero), contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .aspectRatio(360f / 172f) - .clip(RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp)), + modifier = + Modifier + .fillMaxWidth() + .aspectRatio(360f / 172f) + .clip(RoundedCornerShape(bottomEnd = 32.dp, bottomStart = 32.dp)), ) } else { Image( painter = painterResource(R.drawable.img_no_peding_study), contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .aspectRatio(360f / 172f) + modifier = + Modifier + .fillMaxWidth() + .aspectRatio(360f / 172f), ) } Column( @@ -404,35 +407,35 @@ fun StudyCountText( ) { Box( modifier = - modifier - .padding(horizontal = 16.dp) - .fillMaxWidth() - .height(58.dp), + modifier + .padding(horizontal = 16.dp) + .fillMaxWidth() + .height(58.dp), contentAlignment = Alignment.CenterStart, ) { Column( modifier = - Modifier - .padding(start = 8.dp), + Modifier + .padding(start = 8.dp), ) { Text( text = - when { - completeCount > 0 && remainingCount != 0 -> stringResource(R.string.todo_complete_count_text, completeCount) - remainingCount == 0 -> stringResource(R.string.todo_complete_remaining_nothing_text) - else -> stringResource(R.string.todo_complete_nothing_text) - }, + when { + completeCount > 0 && remainingCount != 0 -> stringResource(R.string.todo_complete_count_text, completeCount) + remainingCount == 0 -> stringResource(R.string.todo_complete_remaining_nothing_text) + else -> stringResource(R.string.todo_complete_nothing_text) + }, style = BbangZipTheme.typography.label1Bold, color = BbangZipTheme.colors.labelAlternative_282119_61, ) Text( text = - if (remainingCount != 0) { - stringResource(R.string.todo_remaing_count_text, remainingCount) - } else { - stringResource(R.string.todo_remaining_nothing_text) - }, + if (remainingCount != 0) { + stringResource(R.string.todo_remaing_count_text, remainingCount) + } else { + stringResource(R.string.todo_remaining_nothing_text) + }, style = BbangZipTheme.typography.title3Bold, color = BbangZipTheme.colors.labelNormal_282119, ) @@ -448,18 +451,18 @@ fun DeleteAndFilterIcons( ) { Row( modifier = - modifier - .padding(horizontal = 16.dp) - .fillMaxWidth(), + modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { Spacer(modifier = Modifier.weight(1f)) Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onDeleteIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onDeleteIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -472,9 +475,9 @@ fun DeleteAndFilterIcons( Box( modifier = - Modifier - .clip(CircleShape) - .clickable { onFilterIconClicked() }, + Modifier + .clip(CircleShape) + .clickable { onFilterIconClicked() }, contentAlignment = Alignment.Center, ) { Icon( @@ -515,15 +518,14 @@ fun BbangZipToDoFilterPickerBottomSheet( Text( text = item.filter, modifier = - Modifier - .fillMaxWidth() - - .applyFilterOnClick { onSelectedItemChanged(item) } - .background( - color = if (item != selectedItem) BbangZipTheme.colors.staticWhite_FFFFFF else BbangZipTheme.colors.fillStrong_68645E_16, - shape = RoundedCornerShape(16.dp), - ) - .padding(vertical = 8.dp), + Modifier + .fillMaxWidth() + .applyFilterOnClick { onSelectedItemChanged(item) } + .background( + color = if (item != selectedItem) BbangZipTheme.colors.staticWhite_FFFFFF else BbangZipTheme.colors.fillStrong_68645E_16, + shape = RoundedCornerShape(16.dp), + ) + .padding(vertical = 8.dp), textAlign = TextAlign.Center, style = BbangZipTheme.typography.body1Bold, color = BbangZipTheme.colors.labelNormal_282119, @@ -553,9 +555,9 @@ fun RevertCompleteBottomSheet( Text( text = bottomSheetTitle, modifier = - Modifier - .align(Alignment.CenterHorizontally) - .padding(vertical = 15.dp), + Modifier + .align(Alignment.CenterHorizontally) + .padding(vertical = 15.dp), style = BbangZipTheme.typography.headline1Bold, color = BbangZipTheme.colors.labelNeutral_282119_88, ) @@ -766,4 +768,3 @@ fun TodoScreenMockPreview() { bottomPadding = PaddingValues(), ) } - From 9c62ad046529591f1744893ae88ed2431dd8cda7 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 14:41:39 +0900 Subject: [PATCH 16/25] =?UTF-8?q?[feat]=20#70=20detail=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/subject/SubjectScreen.kt | 2 +- .../subjectdetail/SubjectDetatilScreen.kt | 3 +- .../main/res/drawable/img_subject_header.xml | 30 +++++++++---------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt index eed64b46..cb77ee14 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt @@ -374,7 +374,7 @@ private fun DeleteCardView( } } } else { - for (i in 0 until subjects.size / 2 + 1) { + for (i in 0 until subjects.size / 2) { Row( modifier = Modifier diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index c71177dc..7ac17fb8 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -575,8 +575,7 @@ fun TwoLineTextWithWordWrap( modifier = Modifier .width(200.dp) - .padding(top = 92.dp, start = 20.dp) - .height(56.dp), + .padding(top = 92.dp, start = 20.dp), style = BbangZipTheme.typography.heading2Bold, onTextLayout = { textLayoutResult -> if (displayText == null) { diff --git a/app/src/main/res/drawable/img_subject_header.xml b/app/src/main/res/drawable/img_subject_header.xml index 6341c8fc..63175fb3 100644 --- a/app/src/main/res/drawable/img_subject_header.xml +++ b/app/src/main/res/drawable/img_subject_header.xml @@ -19,7 +19,7 @@ android:fillColor="#ffffff" android:fillAlpha="0.4"/> @@ -94,7 +94,7 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -134,17 +134,17 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -204,17 +204,17 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -249,7 +249,7 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -299,7 +299,7 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -364,7 +364,7 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -374,12 +374,12 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -389,7 +389,7 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> @@ -459,7 +459,7 @@ android:fillColor="#FFB45A" android:fillAlpha="0.4"/> From f7d686f7cc30ad616d966380d83a913df61ac23e Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 15:32:17 +0900 Subject: [PATCH 17/25] =?UTF-8?q?[feat]=20#70=20modifyMotivation=20api=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/dto/request/RequestSubjectOptions.kt | 2 + .../remote/SubjectRepositoryImpl.kt | 7 +- .../bbangzip/data/service/SubjectService.kt | 3 +- .../org/android/bbangzip/di/UseCaseModule.kt | 6 + .../ModifyMotivationMessageContract.kt | 4 + .../ModifyMotivationMessageNavigation.kt | 3 + .../ModifyMotivationMessageRoute.kt | 6 + .../ModifyMotivationMessageViewModel.kt | 193 +++++++++++------- 8 files changed, 144 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt index 5a810cda..cb2a7616 100644 --- a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt @@ -1,7 +1,9 @@ package org.android.bbangzip.data.dto.request import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class RequestSubjectOptions( @SerialName("value") val value: String diff --git a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt index 19452a38..43250ceb 100644 --- a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt +++ b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt @@ -24,20 +24,21 @@ constructor( runCatching { val response = subjectRemoteDataSource.postSubjectName() - response.data ?: throw IllegalStateException(response.message ?: "Null Error") + response.code ?: throw IllegalStateException(response.message ?: "Null Error") } override suspend fun deleteSubjects(): Result = runCatching { val response = subjectRemoteDataSource.deleteSubjects() - response.data ?: throw IllegalStateException(response.message ?: "Null Error") + response.code ?: throw IllegalStateException(response.message ?: "Null Error") } override suspend fun putSubjectOptions(subjectId: Int, options: String, requestSubjectOptions: RequestSubjectOptions): Result = runCatching { val response = subjectRemoteDataSource.putSubjectOptions(subjectId, options, requestSubjectOptions) - response.data ?: throw IllegalStateException(response.message ?: "Null Error") + response.code ?: throw IllegalStateException(response.message ?: "Null Error") + } } diff --git a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt index b8e33a31..d017392d 100644 --- a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt +++ b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt @@ -6,6 +6,7 @@ import org.android.bbangzip.data.util.base.BaseResponse import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET +import retrofit2.http.HTTP import retrofit2.http.POST import retrofit2.http.PUT import retrofit2.http.Path @@ -20,7 +21,7 @@ interface SubjectService { @DELETE("/api/v1/subjects") suspend fun deleteSubjects(): BaseResponse - @PUT("/api/v1/subjects/{subjectId}/{options}") + @HTTP(method = "PUT", path = "/api/v1/subjects/{subjectId}/{options}", hasBody = true) suspend fun putSubjectOptions( @Path("subjectId") subjectId: Int, @Path("options") options: String, diff --git a/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt b/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt index 25685ad4..a6714302 100644 --- a/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt +++ b/app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt @@ -27,6 +27,7 @@ import org.android.bbangzip.domain.usecase.PostCompleteCardIdUseCase import org.android.bbangzip.domain.usecase.PostDeletedItemListUseCase import org.android.bbangzip.domain.usecase.PostOnboardingUseCase import org.android.bbangzip.domain.usecase.PostUnCompleteCardIdUseCase +import org.android.bbangzip.domain.usecase.PutSubjectOptionsUseCase import javax.inject.Singleton @Module @@ -116,4 +117,9 @@ class UseCaseModule { @Singleton fun providesDeleteSubjectsUseCase(subjectRepository: SubjectRepository): DeleteSubjectsUseCase = DeleteSubjectsUseCase(subjectRepository = subjectRepository) + + @Provides + @Singleton + fun providesPutSubjectOptionsUseCase(subjectRepository: SubjectRepository): PutSubjectOptionsUseCase = + PutSubjectOptionsUseCase(subjectRepository = subjectRepository) } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt index 4910b71a..b7372c0c 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt @@ -28,6 +28,8 @@ class ModifyMotivationMessageContract { data class OnClickModifyBtn(val subjectId: Int, val subjectName: String) : ModifyMotivationMessageEvent data object OnClickDeleteBtn : ModifyMotivationMessageEvent + + data class Initialize(val subjectId: Int,val subjectName: String) : ModifyMotivationMessageEvent } sealed interface ModifyMotivationMessageReduce : BaseContract.Reduce { @@ -40,6 +42,8 @@ class ModifyMotivationMessageContract { data class UpdateIsTextFieldFocused(val isTextFieldFocused: Boolean) : ModifyMotivationMessageReduce data object ResetSubjectNamge : ModifyMotivationMessageReduce + + data class UpdateSubjectInfo(val subjectId: Int,val subjectName: String) : ModifyMotivationMessageReduce } sealed interface ModifyMotivationMessageSideEffect : BaseContract.SideEffect { diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageNavigation.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageNavigation.kt index 9aedab31..f29445d5 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageNavigation.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageNavigation.kt @@ -4,6 +4,7 @@ import androidx.compose.material3.SnackbarHostState import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.toRoute import kotlinx.serialization.Serializable fun NavController.navigateToModifyMotivationMessage( @@ -21,6 +22,8 @@ fun NavGraphBuilder.modifyMotivationMessageNavGraph( ) { composable { ModifyMotivationMessageRoute( + subjectId = it.toRoute().subjectId, + subjectName = it.toRoute().subjectName, navigateToSubjectDetail = navigateToSubjectDetail, snackbarHostState = snackbarHostState, ) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt index 42fd13e9..2636ad4c 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt @@ -12,12 +12,18 @@ import kotlinx.coroutines.launch @Composable fun ModifyMotivationMessageRoute( + subjectId: Int, + subjectName:String, viewModel: ModifyMotivationMessageViewModel = hiltViewModel(), navigateToSubjectDetail: (Int, String) -> Unit, snackbarHostState: SnackbarHostState, ) { val modifyMotivationMessageState by viewModel.uiState.collectAsStateWithLifecycle() + LaunchedEffect (Unit){ + viewModel.setEvent(ModifyMotivationMessageContract.ModifyMotivationMessageEvent.Initialize(subjectId, subjectName)) + } + LaunchedEffect(viewModel.uiSideEffect) { viewModel.uiSideEffect.collectLatest { effect -> when (effect) { diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt index 0eeed038..250b6e80 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt @@ -2,98 +2,139 @@ package org.android.bbangzip.presentation.ui.subject.modify.motivationmessage import android.os.Parcelable import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.android.bbangzip.data.dto.request.RequestSubjectOptions +import org.android.bbangzip.domain.usecase.PutSubjectOptionsUseCase import org.android.bbangzip.presentation.model.BbangZipTextFieldInputState import org.android.bbangzip.presentation.util.base.BaseViewModel +import timber.log.Timber import javax.inject.Inject @HiltViewModel class ModifyMotivationMessageViewModel - @Inject - constructor( - savedStateHandle: SavedStateHandle, - ) : BaseViewModel( - savedStateHandle = savedStateHandle, - ) { - override fun createInitialState(savedState: Parcelable?): ModifyMotivationMessageContract.ModifyMotivationMessageState { - return savedState as? ModifyMotivationMessageContract.ModifyMotivationMessageState ?: ModifyMotivationMessageContract.ModifyMotivationMessageState() - } +@Inject +constructor( + private val putSubjectOptionsUseCase: PutSubjectOptionsUseCase, + savedStateHandle: SavedStateHandle, +) : BaseViewModel( + savedStateHandle = savedStateHandle, +) { + override fun createInitialState(savedState: Parcelable?): ModifyMotivationMessageContract.ModifyMotivationMessageState { + return savedState as? ModifyMotivationMessageContract.ModifyMotivationMessageState ?: ModifyMotivationMessageContract.ModifyMotivationMessageState() + } - override fun handleEvent(event: ModifyMotivationMessageContract.ModifyMotivationMessageEvent) { - when (event) { - is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnChangeMotivationMessage -> { - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage(motivationMessage = event.motivationMessage)) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) - } - ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickBackBtn -> { - } - is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickModifyBtn -> { - setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.NavigateSubjectDetail(subjectId = event.subjectId, subjectName = event.subjectName)) - setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.ShowSnackBar("각오 한 마디 작성 완료!")) - } - is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnFocusTextField -> { - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused(event.isTextFieldFocused)) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) - } + override fun handleEvent(event: ModifyMotivationMessageContract.ModifyMotivationMessageEvent) { + when (event) { + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnChangeMotivationMessage -> { + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage(motivationMessage = event.motivationMessage)) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) + } - ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickDeleteBtn -> { - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) - } + ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickBackBtn -> { } - } - override fun reduceState( - state: ModifyMotivationMessageContract.ModifyMotivationMessageState, - reduce: ModifyMotivationMessageContract.ModifyMotivationMessageReduce, - ): ModifyMotivationMessageContract.ModifyMotivationMessageState { - return when (reduce) { - ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled -> { - state.copy( - isButtonEnable = state.motivationMessage.isNotEmpty() && state.motivationMessageTextFieldState != BbangZipTextFieldInputState.Alert, - ) - } - is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused -> { - state.copy( - isTextFieldFocused = reduce.isTextFieldFocused, - ) - } - is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage -> { - state.copy( - motivationMessage = reduce.motivationMessage, - ) - } - ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState -> { - state.copy( - motivationMessageTextFieldState = - determineTextFieldType( - state.motivationMessage, - state.isTextFieldFocused, - ), - ) + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickModifyBtn -> { + viewModelScope.launch { + putMotivationMessage(event.subjectId,event.subjectName) } + } - ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge -> { - state.copy( - motivationMessage = "", - ) - } + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnFocusTextField -> { + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused(event.isTextFieldFocused)) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) + } + + ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickDeleteBtn -> { + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) } + + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.Initialize -> + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateSubjectInfo(event.subjectId, event.subjectName)) } + } + + override fun reduceState( + state: ModifyMotivationMessageContract.ModifyMotivationMessageState, + reduce: ModifyMotivationMessageContract.ModifyMotivationMessageReduce, + ): ModifyMotivationMessageContract.ModifyMotivationMessageState { + return when (reduce) { + ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled -> { + state.copy( + isButtonEnable = state.motivationMessage.isNotEmpty() && state.motivationMessageTextFieldState != BbangZipTextFieldInputState.Alert, + ) + } + + is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused -> { + state.copy( + isTextFieldFocused = reduce.isTextFieldFocused, + ) + } + + is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage -> { + state.copy( + motivationMessage = reduce.motivationMessage, + ) + } + + ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState -> { + state.copy( + motivationMessageTextFieldState = + determineTextFieldType( + state.motivationMessage, + state.isTextFieldFocused, + ), + ) + } - private fun determineTextFieldType( - text: String, - isFocused: Boolean, - ): BbangZipTextFieldInputState { - return when { - text.isEmpty() && !isFocused -> BbangZipTextFieldInputState.Default - text.isEmpty() && isFocused -> BbangZipTextFieldInputState.Placeholder - text.contains(Regex("[\\p{So}\\p{Cn}]+")) -> BbangZipTextFieldInputState.Alert - text.isNotEmpty() && isFocused -> BbangZipTextFieldInputState.Typing - else -> BbangZipTextFieldInputState.Field + ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge -> { + state.copy( + motivationMessage = "", + ) } + + is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateSubjectInfo -> { + state.copy( + subjectId = reduce.subjectId, subjectName = reduce.subjectName + ) + } + } + } + + private fun determineTextFieldType( + text: String, + isFocused: Boolean, + ): BbangZipTextFieldInputState { + return when { + text.isEmpty() && !isFocused -> BbangZipTextFieldInputState.Default + text.isEmpty() && isFocused -> BbangZipTextFieldInputState.Placeholder + text.contains(Regex("[\\p{So}\\p{Cn}]+")) -> BbangZipTextFieldInputState.Alert + text.isNotEmpty() && isFocused -> BbangZipTextFieldInputState.Typing + else -> BbangZipTextFieldInputState.Field + } + } + + private suspend fun putMotivationMessage( + subjectId:Int, + subjectName:String + ) { + putSubjectOptionsUseCase( + subjectId = subjectId, + options = "motivationMessage", + requestSubjectOptions = RequestSubjectOptions( + value = currentUiState.motivationMessage + ) + ).onSuccess { + Timber.tag("motivate").d("각오 한 마디 저장") + setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.NavigateSubjectDetail(subjectId = subjectId, subjectName = subjectName)) + setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.ShowSnackBar("각오 한 마디 작성 완료!")) + }.onFailure {error-> + Timber.tag("motivate").d(error) } } +} From 8dbb573e0653b0563a5c2f58ec1e8140f8a0c0e9 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 15:42:08 +0900 Subject: [PATCH 18/25] =?UTF-8?q?[feat]=20#70=20modifySubjectName=20api=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subjectname/ModifySubjectNameViewModel.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt index 6a896cf4..1575125c 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt @@ -2,15 +2,22 @@ package org.android.bbangzip.presentation.ui.subject.modify.subjectname import android.os.Parcelable import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.android.bbangzip.data.dto.request.RequestSubjectOptions +import org.android.bbangzip.domain.usecase.PutSubjectOptionsUseCase import org.android.bbangzip.presentation.model.BbangZipTextFieldInputState +import org.android.bbangzip.presentation.ui.subject.modify.motivationmessage.ModifyMotivationMessageContract import org.android.bbangzip.presentation.util.base.BaseViewModel +import timber.log.Timber import javax.inject.Inject @HiltViewModel class ModifySubjectNameViewModel @Inject constructor( + private val putSubjectOptionsUseCase: PutSubjectOptionsUseCase, savedStateHandle: SavedStateHandle, ) : BaseViewModel( savedStateHandle = savedStateHandle, @@ -31,6 +38,9 @@ class ModifySubjectNameViewModel updateState(ModifySubjectNameContract.ModifySubjectNameReduce.UpdateSubjectNameInputState) } ModifySubjectNameContract.ModifySubjectNameEvent.OnClickBackBtn -> { + viewModelScope.launch { + putMotivationMessage(currentUiState.subjectId, currentUiState.subjectName) + } } is ModifySubjectNameContract.ModifySubjectNameEvent.OnClickModifyBtn -> { setSideEffect(ModifySubjectNameContract.ModifySubjectNameSideEffect.NavigationSubjectDetail(subjectId = event.subjectId, subjectName = event.subjectName)) @@ -106,4 +116,22 @@ class ModifySubjectNameViewModel else -> BbangZipTextFieldInputState.Field } } + + private suspend fun putMotivationMessage( + subjectId:Int, + subjectName:String + ) { + putSubjectOptionsUseCase( + subjectId = subjectId, + options = "subjectName", + requestSubjectOptions = RequestSubjectOptions( + value = currentUiState.subjectName + ) + ).onSuccess { + Timber.tag("motivate").d("각오 한 마디 저장") + setSideEffect(ModifySubjectNameContract.ModifySubjectNameSideEffect.NavigationSubjectDetail(subjectId = subjectId, subjectName = subjectName)) + }.onFailure {error-> + Timber.tag("motivate").d(error) + } + } } From 5c558bca061c3f91a0b1f4ffb4d11b64b2462f12 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 15:57:12 +0900 Subject: [PATCH 19/25] =?UTF-8?q?[feat]=20#70=20=EA=B3=BC=EB=AA=A9=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/SubjectRemoteDataSource.kt | 6 ++-- .../data/dto/request/RequestAddSubjectsDto.kt | 3 ++ .../dto/request/RequestDeleteSubjectsDto.kt | 2 ++ .../remote/SubjectRepositoryImpl.kt | 10 ++++--- .../bbangzip/data/service/SubjectService.kt | 6 ++-- .../repository/remote/SubjectRepository.kt | 6 ++-- .../domain/usecase/DeleteSubjectsUseCase.kt | 5 ++-- .../usecase/PostAddSubjectNameUseCase.kt | 5 ++-- .../ui/subject/SubjectViewModel.kt | 20 +++++-------- .../subject/addsubject/AddSubjectViewModel.kt | 30 ++++++++++++++++++- 10 files changed, 66 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt index 71cd16f7..b8c965ac 100644 --- a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt +++ b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt @@ -1,5 +1,7 @@ package org.android.bbangzip.data.datasource.remote +import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto +import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto import org.android.bbangzip.data.service.SubjectService @@ -11,9 +13,9 @@ class SubjectRemoteDataSource constructor(private val subjectService: SubjectService) { suspend fun getSubjectInfo(): BaseResponse = subjectService.getSubjectInfo() - suspend fun postSubjectName(): BaseResponse = subjectService.postSubjectName() + suspend fun postSubjectName(requestAddSubjectsDto: RequestAddSubjectsDto): BaseResponse = subjectService.postSubjectName(requestAddSubjectsDto) - suspend fun deleteSubjects(): BaseResponse = subjectService.deleteSubjects() + suspend fun deleteSubjects(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): BaseResponse = subjectService.deleteSubjects(requestDeleteSubjectsDto) suspend fun putSubjectOptions( subjectId: Int, diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt index b56b3115..c1bf35a2 100644 --- a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt @@ -1,7 +1,10 @@ package org.android.bbangzip.data.dto.request import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.io.Serial +@Serializable data class RequestAddSubjectsDto( @SerialName("subjectName") val subjectName: String, diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt index 817182e6..9ebbada3 100644 --- a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt @@ -1,7 +1,9 @@ package org.android.bbangzip.data.dto.request import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class RequestDeleteSubjectsDto( @SerialName("subjectIds") val subjectIds: List, diff --git a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt index 43250ceb..23e34df5 100644 --- a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt +++ b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt @@ -1,6 +1,8 @@ package org.android.bbangzip.data.repositoryImpl.remote import org.android.bbangzip.data.datasource.remote.SubjectRemoteDataSource +import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto +import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.domain.model.SubjectInfoEntity import org.android.bbangzip.domain.repository.remote.SubjectRepository @@ -20,16 +22,16 @@ constructor( responseData.toSubjectInfoEntity() } - override suspend fun postSubjectName(): Result = + override suspend fun postSubjectName(requestAddSubjectsDto: RequestAddSubjectsDto): Result = runCatching { - val response = subjectRemoteDataSource.postSubjectName() + val response = subjectRemoteDataSource.postSubjectName(requestAddSubjectsDto = requestAddSubjectsDto) response.code ?: throw IllegalStateException(response.message ?: "Null Error") } - override suspend fun deleteSubjects(): Result = + override suspend fun deleteSubjects(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): Result = runCatching { - val response = subjectRemoteDataSource.deleteSubjects() + val response = subjectRemoteDataSource.deleteSubjects(requestDeleteSubjectsDto = requestDeleteSubjectsDto) response.code ?: throw IllegalStateException(response.message ?: "Null Error") } diff --git a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt index d017392d..f70df09e 100644 --- a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt +++ b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt @@ -1,5 +1,7 @@ package org.android.bbangzip.data.service +import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto +import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto import org.android.bbangzip.data.util.base.BaseResponse @@ -16,10 +18,10 @@ interface SubjectService { suspend fun getSubjectInfo(): BaseResponse @POST("/api/v1/subjects") - suspend fun postSubjectName(): BaseResponse + suspend fun postSubjectName(@Body requestAddSubjectsDto: RequestAddSubjectsDto): BaseResponse @DELETE("/api/v1/subjects") - suspend fun deleteSubjects(): BaseResponse + suspend fun deleteSubjects(@Body requestDeleteSubjectsDto: RequestDeleteSubjectsDto): BaseResponse @HTTP(method = "PUT", path = "/api/v1/subjects/{subjectId}/{options}", hasBody = true) suspend fun putSubjectOptions( diff --git a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt index 0fbb1822..f3f717a6 100644 --- a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt +++ b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt @@ -1,5 +1,7 @@ package org.android.bbangzip.domain.repository.remote +import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto +import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.data.util.base.BaseResponse import org.android.bbangzip.domain.model.SubjectInfoEntity @@ -7,9 +9,9 @@ import org.android.bbangzip.domain.model.SubjectInfoEntity interface SubjectRepository { suspend fun getSubjectInfo(): Result - suspend fun postSubjectName(): Result + suspend fun postSubjectName(requestAddSubjectsDto: RequestAddSubjectsDto): Result - suspend fun deleteSubjects(): Result + suspend fun deleteSubjects(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): Result suspend fun putSubjectOptions( subjectId: Int, diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt index 06ad6a90..04d5f937 100644 --- a/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt @@ -1,10 +1,11 @@ package org.android.bbangzip.domain.usecase +import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.domain.repository.remote.SubjectRepository class DeleteSubjectsUseCase( private val subjectRepository: SubjectRepository ) { - suspend operator fun invoke(): Result = - subjectRepository.deleteSubjects() + suspend operator fun invoke(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): Result = + subjectRepository.deleteSubjects(requestDeleteSubjectsDto = requestDeleteSubjectsDto) } \ No newline at end of file diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt index 73b52dd3..dbb266f3 100644 --- a/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt @@ -1,10 +1,11 @@ package org.android.bbangzip.domain.usecase +import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto import org.android.bbangzip.domain.repository.remote.SubjectRepository class PostAddSubjectNameUseCase ( private val subjectRepository: SubjectRepository ){ - suspend operator fun invoke(): Result = - subjectRepository.postSubjectName() + suspend operator fun invoke(requestAddSubjectsDto: RequestAddSubjectsDto): Result = + subjectRepository.postSubjectName(requestAddSubjectsDto=requestAddSubjectsDto) } \ No newline at end of file diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt index f4eb6541..21d46715 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt @@ -3,6 +3,7 @@ package org.android.bbangzip.presentation.ui.subject import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import dagger.hilt.android.lifecycle.HiltViewModel +import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.domain.usecase.DeleteSubjectsUseCase import org.android.bbangzip.domain.usecase.GetSubjectInfoUseCase import org.android.bbangzip.domain.usecase.PostAddSubjectNameUseCase @@ -19,7 +20,6 @@ class SubjectViewModel constructor( private val getSubjectInfoUseCase: GetSubjectInfoUseCase, private val deleteSubjectsUseCase: DeleteSubjectsUseCase, - private val postAddSubjectNameUseCase: PostAddSubjectNameUseCase, savedStateHandle: SavedStateHandle, ) : BaseViewModel( savedStateHandle = savedStateHandle, @@ -174,7 +174,13 @@ class SubjectViewModel } private suspend fun deleteSubjects() { - deleteSubjectsUseCase() + deleteSubjectsUseCase( + RequestDeleteSubjectsDto( + subjectIds = currentUiState.subjectSetToDelete.toList(), + year = 2025, + semester = "1학기", + ) + ) .onSuccess { updateState(SubjectContract.SubjectReduce.UpdateToDefaultMode) getSubjectInfo() @@ -183,14 +189,4 @@ class SubjectViewModel Timber.tag("이승범").d(error) } } - - private suspend fun postAddSubjectName() { - postAddSubjectNameUseCase() - .onSuccess { - Timber.tag("AddSubject").d("AddSubjectName 성공") - } - .onFailure { error -> - Timber.tag("이승범").d(error) - } - } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt index 78bd98a1..7ad24170 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt @@ -2,15 +2,24 @@ package org.android.bbangzip.presentation.ui.subject.addsubject import android.os.Parcelable import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto +import org.android.bbangzip.data.dto.request.RequestSubjectOptions +import org.android.bbangzip.domain.usecase.PostAddSubjectNameUseCase +import org.android.bbangzip.domain.usecase.PutSubjectOptionsUseCase import org.android.bbangzip.presentation.model.BbangZipTextFieldInputState +import org.android.bbangzip.presentation.ui.subject.modify.motivationmessage.ModifyMotivationMessageContract import org.android.bbangzip.presentation.util.base.BaseViewModel +import timber.log.Timber import javax.inject.Inject @HiltViewModel class AddSubjectViewModel @Inject constructor( + private val postAddSubjectNameUseCase: PostAddSubjectNameUseCase, savedStateHandle: SavedStateHandle, ) : BaseViewModel( savedStateHandle = savedStateHandle, @@ -28,10 +37,13 @@ class AddSubjectViewModel } AddSubjectContract.AddSubjectEvent.OnClickBackBtn -> { + setSideEffect(AddSubjectContract.AddSubjectSideEffect.NavigateSubjectDetail) } AddSubjectContract.AddSubjectEvent.OnClickAddBtn -> { - setSideEffect(AddSubjectContract.AddSubjectSideEffect.NavigateSubjectDetail) + viewModelScope.launch { + putMotivationMessage() + } } is AddSubjectContract.AddSubjectEvent.OnFocusTextField -> { @@ -98,4 +110,20 @@ class AddSubjectViewModel else -> BbangZipTextFieldInputState.Field } } + + private suspend fun putMotivationMessage( + ) { + postAddSubjectNameUseCase( + requestAddSubjectsDto = RequestAddSubjectsDto( + subjectName = currentUiState.subjectName, + year = 2025, + semester = "1학기" + ) + ).onSuccess { + Timber.tag("motivate").d("과목명 저장") + setSideEffect(AddSubjectContract.AddSubjectSideEffect.NavigateSubjectDetail) + }.onFailure {error-> + Timber.tag("motivate").d(error) + } + } } From 65577601b681f4cae0e0ef869da127e52f49a129 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 16:36:43 +0900 Subject: [PATCH 20/25] =?UTF-8?q?[feat]=20#70=20=EA=B3=BC=EB=AA=A9=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95=20API=20=E3=85=85?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bbangzip/data/service/SubjectService.kt | 2 +- .../ui/subject/SubjectContract.kt | 2 +- .../presentation/ui/subject/SubjectRoute.kt | 1 + .../presentation/ui/subject/SubjectScreen.kt | 3 +- .../ui/subject/SubjectViewModel.kt | 11 ++- .../ModifyMotivationMessageRoute.kt | 8 +++ .../subjectname/ModifySubjectNameRoute.kt | 10 +++ .../subjectname/ModifySubjectNameViewModel.kt | 13 ++-- .../subjectdetail/SubjectDetailRoute.kt | 71 ++++++++++++------- .../subjectdetail/SubjectDetatilScreen.kt | 2 +- 10 files changed, 85 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt index f70df09e..230db709 100644 --- a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt +++ b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt @@ -20,7 +20,7 @@ interface SubjectService { @POST("/api/v1/subjects") suspend fun postSubjectName(@Body requestAddSubjectsDto: RequestAddSubjectsDto): BaseResponse - @DELETE("/api/v1/subjects") + @HTTP(method = "DELETE", path = "/api/v1/subjects", hasBody = true) suspend fun deleteSubjects(@Body requestDeleteSubjectsDto: RequestDeleteSubjectsDto): BaseResponse @HTTP(method = "PUT", path = "/api/v1/subjects/{subjectId}/{options}", hasBody = true) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt index 4a9a38db..b61d7879 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectContract.kt @@ -32,7 +32,7 @@ class SubjectContract { data class OnClickDeleteModeCard(val subjectId: Int) : SubjectEvent - data class OnClickDeleteButton(val subjectId: Int) : SubjectEvent + data object OnClickDeleteButton : SubjectEvent } sealed interface SubjectReduce : BaseContract.Reduce { diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectRoute.kt index 29a69ece..05c3ade0 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectRoute.kt @@ -63,6 +63,7 @@ fun SubjectRoute( onClickStudyCard = { id, name -> viewModel.setEvent(SubjectContract.SubjectEvent.OnClickStudyCard(id, name)) }, onClickCancleBtn = { viewModel.setEvent(SubjectContract.SubjectEvent.OnClickCancleIcon) }, onClickAddSubject = { viewModel.setEvent(SubjectContract.SubjectEvent.OnClickAddSubject) }, + onClickDeleteBtn = { viewModel.setEvent(SubjectContract.SubjectEvent.OnClickDeleteButton) }, subjects = subjectState.subjectList, cardViewType = subjectState.cardViewType, deletedSet = subjectState.subjectSetToDelete, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt index cb77ee14..46b9d966 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt @@ -56,6 +56,7 @@ fun SubjectScreen( onClickDeleteModeCard: (Int, String) -> Unit = { _, _ -> }, onClickStudyCard: (Int, String) -> Unit = { _, _ -> }, onClickAddSubject: () -> Unit = {}, + onClickDeleteBtn: ()-> Unit = {}, navigateAddStudy: (SplitStudyData) -> Unit, ) { val configuration = LocalConfiguration.current @@ -155,7 +156,7 @@ fun SubjectScreen( BbangZipButton( bbangZipButtonType = BbangZipButtonType.Solid, bbangZipButtonSize = BbangZipButtonSize.Large, - onClick = { onClickCancleBtn() }, + onClick = { onClickDeleteBtn() }, modifier = Modifier.fillMaxWidth(), label = if (deletedSet.isEmpty()) "삭제하기" else String.format(stringResource(R.string.btn_delete_label), deletedSet.size), trailingIcon = R.drawable.ic_trash_default_24, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt index 21d46715..58db07ab 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt @@ -2,7 +2,9 @@ package org.android.bbangzip.presentation.ui.subject import android.os.Parcelable import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.domain.usecase.DeleteSubjectsUseCase import org.android.bbangzip.domain.usecase.GetSubjectInfoUseCase @@ -37,7 +39,9 @@ class SubjectViewModel is SubjectContract.SubjectEvent.Initialize -> launch { getSubjectInfo() } is SubjectContract.SubjectEvent.OnClickDeleteButton -> { - updateState(SubjectContract.SubjectReduce.UpdateDeletedSet(event.subjectId)) + viewModelScope.launch { + deleteSubjects() + } } is SubjectContract.SubjectEvent.OnClickDeleteModeCard -> { @@ -182,11 +186,14 @@ class SubjectViewModel ) ) .onSuccess { + Timber.tag("delete").d("성공") + updateState(SubjectContract.SubjectReduce.UpdateToDefaultMode) + updateState(SubjectContract.SubjectReduce.RestoreDeletedSet) getSubjectInfo() } .onFailure { error -> - Timber.tag("이승범").d(error) + Timber.tag("delete").d(error) } } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt index 2636ad4c..ce8fec02 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt @@ -1,14 +1,18 @@ package org.android.bbangzip.presentation.ui.subject.modify.motivationmessage +import android.app.Activity import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalView import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import org.android.bbangzip.ui.theme.BbangZipTheme @Composable fun ModifyMotivationMessageRoute( @@ -19,6 +23,10 @@ fun ModifyMotivationMessageRoute( snackbarHostState: SnackbarHostState, ) { val modifyMotivationMessageState by viewModel.uiState.collectAsStateWithLifecycle() + val view = LocalView.current + val activity = view.context as Activity + + activity.window.statusBarColor = BbangZipTheme.colors.staticWhite_FFFFFF.toArgb() LaunchedEffect (Unit){ viewModel.setEvent(ModifyMotivationMessageContract.ModifyMotivationMessageEvent.Initialize(subjectId, subjectName)) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameRoute.kt index 304882fc..be340782 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameRoute.kt @@ -1,11 +1,16 @@ package org.android.bbangzip.presentation.ui.subject.modify.subjectname +import android.app.Activity import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalView import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.flow.collectLatest +import org.android.bbangzip.ui.theme.BbangZipTheme +import timber.log.Timber @Composable fun ModifySubjectNameRoute( @@ -15,8 +20,13 @@ fun ModifySubjectNameRoute( navigateToSubjectDetail: (Int, String) -> Unit, ) { val modifySubjectNameState by viewModel.uiState.collectAsStateWithLifecycle() + val view = LocalView.current + val activity = view.context as Activity + + activity.window.statusBarColor = BbangZipTheme.colors.staticWhite_FFFFFF.toArgb() LaunchedEffect(Unit) { + Timber.tag("initnitnitnit").d("subjectId: $subjectId, subjectName: $subjectName") viewModel.setEvent(ModifySubjectNameContract.ModifySubjectNameEvent.Initialize(subjectId, subjectName)) } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt index 1575125c..10fa78cb 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt @@ -38,12 +38,11 @@ class ModifySubjectNameViewModel updateState(ModifySubjectNameContract.ModifySubjectNameReduce.UpdateSubjectNameInputState) } ModifySubjectNameContract.ModifySubjectNameEvent.OnClickBackBtn -> { - viewModelScope.launch { - putMotivationMessage(currentUiState.subjectId, currentUiState.subjectName) - } } is ModifySubjectNameContract.ModifySubjectNameEvent.OnClickModifyBtn -> { - setSideEffect(ModifySubjectNameContract.ModifySubjectNameSideEffect.NavigationSubjectDetail(subjectId = event.subjectId, subjectName = event.subjectName)) + viewModelScope.launch { + putModifySubjectName(currentUiState.subjectId, currentUiState.subjectName) + } } is ModifySubjectNameContract.ModifySubjectNameEvent.OnFocusTextField -> { updateState(ModifySubjectNameContract.ModifySubjectNameReduce.UpdateIsTextFieldFocused(event.isTextFieldFocused)) @@ -117,7 +116,7 @@ class ModifySubjectNameViewModel } } - private suspend fun putMotivationMessage( + private suspend fun putModifySubjectName( subjectId:Int, subjectName:String ) { @@ -125,10 +124,10 @@ class ModifySubjectNameViewModel subjectId = subjectId, options = "subjectName", requestSubjectOptions = RequestSubjectOptions( - value = currentUiState.subjectName + value = subjectName ) ).onSuccess { - Timber.tag("motivate").d("각오 한 마디 저장") + Timber.tag("motivate").d("과목명 저장") setSideEffect(ModifySubjectNameContract.ModifySubjectNameSideEffect.NavigationSubjectDetail(subjectId = subjectId, subjectName = subjectName)) }.onFailure {error-> Timber.tag("motivate").d(error) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt index ec8f1033..a9e472a7 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt @@ -1,12 +1,19 @@ package org.android.bbangzip.presentation.ui.subject.subjectdetail +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.flow.collectLatest +import org.android.bbangzip.ui.theme.BbangZipTheme @Composable fun SubjectDetailRoute( @@ -19,6 +26,7 @@ fun SubjectDetailRoute( viewModel: SubjectDetailViewModel = hiltViewModel(), ) { val subjectDetailState by viewModel.uiState.collectAsStateWithLifecycle() + val success by viewModel.success.collectAsStateWithLifecycle(initialValue = false) LaunchedEffect(Unit) { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.Initialize(subjectId, subjectName)) } @@ -46,29 +54,42 @@ fun SubjectDetailRoute( } } - SubjectDetailScreen( - padding = padding, - isMenuOpen = subjectDetailState.isMenuOpen, - todoList = subjectDetailState.todoList, - pieceViewType = subjectDetailState.pieceViewType, - deletedSet = subjectDetailState.selectedItemSet, - revertCompleteBottomSheetState = subjectDetailState.revertCompleteBottomSheetState, - selectedItemId = subjectDetailState.selectedItemId, - subjectId = subjectDetailState.subjectId, - subjectName = subjectDetailState.subjectName, - motivationMessage = subjectDetailState.motivationMessage, - examDDay = subjectDetailState.examDday, - examDate = subjectDetailState.examDate, - onCloseIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCloseIconClicked) }, - onTrashIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnTrashIconClicked) }, - onDeleteModeCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDeleteModeCardClicked(id)) }, - onDefaultCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDefaultCardClicked(id)) }, - onCompleteCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCompleteCardClicked(id)) }, - onClickEnrollMotivationMessage = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickEnrollMotivateMessage(id, name)) }, - onClickModifySubjectName = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickModifySubjectName(id, name)) }, - onClickKebabMenu = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu) }, - onRevertCompleteBottomSheetDismissRequest = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDissmissRequest) }, - onRevertCompleteBottomSheetApproveButtonClicked = { pieceId -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetApproveButtonClicked(pieceId = pieceId)) }, - onRevertCompleteBottomSheetDismissButtonClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDismissButtonClicked) }, - ) + when(success) { + true -> + SubjectDetailScreen( + padding = padding, + isMenuOpen = subjectDetailState.isMenuOpen, + todoList = subjectDetailState.todoList, + pieceViewType = subjectDetailState.pieceViewType, + deletedSet = subjectDetailState.selectedItemSet, + revertCompleteBottomSheetState = subjectDetailState.revertCompleteBottomSheetState, + selectedItemId = subjectDetailState.selectedItemId, + subjectId = subjectDetailState.subjectId, + subjectName = subjectDetailState.subjectName, + motivationMessage = subjectDetailState.motivationMessage, + examDDay = subjectDetailState.examDday, + examDate = subjectDetailState.examDate, + onCloseIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCloseIconClicked) }, + onTrashIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnTrashIconClicked) }, + onDeleteModeCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDeleteModeCardClicked(id)) }, + onDefaultCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDefaultCardClicked(id)) }, + onCompleteCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCompleteCardClicked(id)) }, + onClickEnrollMotivationMessage = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickEnrollMotivateMessage(id, name)) }, + onClickModifySubjectName = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickModifySubjectName(id, name)) }, + onClickKebabMenu = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu) }, + onRevertCompleteBottomSheetDismissRequest = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDissmissRequest) }, + onRevertCompleteBottomSheetApproveButtonClicked = { pieceId -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetApproveButtonClicked(pieceId = pieceId)) }, + onRevertCompleteBottomSheetDismissButtonClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDismissButtonClicked) }, + ) + false -> + Box( + modifier = + Modifier + .fillMaxSize() + .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator(color = BbangZipTheme.colors.backgroundAccent_FFDAA0) + } + } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index 7ac17fb8..cdf51c49 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -574,7 +574,7 @@ fun TwoLineTextWithWordWrap( text = displayText ?: AnnotatedString(text), modifier = Modifier - .width(200.dp) + .width(230.dp) .padding(top = 92.dp, start = 20.dp), style = BbangZipTheme.typography.heading2Bold, onTextLayout = { textLayoutResult -> From a82fc3a20f3b9759dbdbd3b67e170816f7b26f27 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 16:39:31 +0900 Subject: [PATCH 21/25] =?UTF-8?q?[chore]=20#70=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/SubjectRemoteDataSource.kt | 22 +++--- .../remote/SubjectRepositoryImpl.kt | 73 ++++++++++--------- .../bbangzip/data/service/SubjectService.kt | 12 +-- .../repository/remote/SubjectRepository.kt | 3 +- .../presentation/ui/subject/SubjectScreen.kt | 2 +- 5 files changed, 58 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt index b8c965ac..2c2b162f 100644 --- a/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt +++ b/app/src/main/java/org/android/bbangzip/data/datasource/remote/SubjectRemoteDataSource.kt @@ -9,17 +9,17 @@ import org.android.bbangzip.data.util.base.BaseResponse import javax.inject.Inject class SubjectRemoteDataSource -@Inject -constructor(private val subjectService: SubjectService) { - suspend fun getSubjectInfo(): BaseResponse = subjectService.getSubjectInfo() + @Inject + constructor(private val subjectService: SubjectService) { + suspend fun getSubjectInfo(): BaseResponse = subjectService.getSubjectInfo() - suspend fun postSubjectName(requestAddSubjectsDto: RequestAddSubjectsDto): BaseResponse = subjectService.postSubjectName(requestAddSubjectsDto) + suspend fun postSubjectName(requestAddSubjectsDto: RequestAddSubjectsDto): BaseResponse = subjectService.postSubjectName(requestAddSubjectsDto) - suspend fun deleteSubjects(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): BaseResponse = subjectService.deleteSubjects(requestDeleteSubjectsDto) + suspend fun deleteSubjects(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): BaseResponse = subjectService.deleteSubjects(requestDeleteSubjectsDto) - suspend fun putSubjectOptions( - subjectId: Int, - options: String, - requestSubjectOptions: RequestSubjectOptions - ): BaseResponse = subjectService.putSubjectOptions(subjectId, options, requestSubjectOptions) -} + suspend fun putSubjectOptions( + subjectId: Int, + options: String, + requestSubjectOptions: RequestSubjectOptions, + ): BaseResponse = subjectService.putSubjectOptions(subjectId, options, requestSubjectOptions) + } diff --git a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt index 23e34df5..ddbe8cce 100644 --- a/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt +++ b/app/src/main/java/org/android/bbangzip/data/repositoryImpl/remote/SubjectRepositoryImpl.kt @@ -9,38 +9,41 @@ import org.android.bbangzip.domain.repository.remote.SubjectRepository import javax.inject.Inject class SubjectRepositoryImpl -@Inject -constructor( - private val subjectRemoteDataSource: SubjectRemoteDataSource, -) : SubjectRepository { - override suspend fun getSubjectInfo(): Result = - runCatching { - val response = subjectRemoteDataSource.getSubjectInfo() - - val responseData = response.data ?: throw IllegalStateException(response.message ?: "Null Error") - - responseData.toSubjectInfoEntity() - } - - override suspend fun postSubjectName(requestAddSubjectsDto: RequestAddSubjectsDto): Result = - runCatching { - val response = subjectRemoteDataSource.postSubjectName(requestAddSubjectsDto = requestAddSubjectsDto) - - response.code ?: throw IllegalStateException(response.message ?: "Null Error") - } - - override suspend fun deleteSubjects(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): Result = - runCatching { - val response = subjectRemoteDataSource.deleteSubjects(requestDeleteSubjectsDto = requestDeleteSubjectsDto) - - response.code ?: throw IllegalStateException(response.message ?: "Null Error") - } - - override suspend fun putSubjectOptions(subjectId: Int, options: String, requestSubjectOptions: RequestSubjectOptions): Result = - runCatching { - val response = subjectRemoteDataSource.putSubjectOptions(subjectId, options, requestSubjectOptions) - - response.code ?: throw IllegalStateException(response.message ?: "Null Error") - - } -} + @Inject + constructor( + private val subjectRemoteDataSource: SubjectRemoteDataSource, + ) : SubjectRepository { + override suspend fun getSubjectInfo(): Result = + runCatching { + val response = subjectRemoteDataSource.getSubjectInfo() + + val responseData = response.data ?: throw IllegalStateException(response.message ?: "Null Error") + + responseData.toSubjectInfoEntity() + } + + override suspend fun postSubjectName(requestAddSubjectsDto: RequestAddSubjectsDto): Result = + runCatching { + val response = subjectRemoteDataSource.postSubjectName(requestAddSubjectsDto = requestAddSubjectsDto) + + response.code ?: throw IllegalStateException(response.message ?: "Null Error") + } + + override suspend fun deleteSubjects(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): Result = + runCatching { + val response = subjectRemoteDataSource.deleteSubjects(requestDeleteSubjectsDto = requestDeleteSubjectsDto) + + response.code ?: throw IllegalStateException(response.message ?: "Null Error") + } + + override suspend fun putSubjectOptions( + subjectId: Int, + options: String, + requestSubjectOptions: RequestSubjectOptions, + ): Result = + runCatching { + val response = subjectRemoteDataSource.putSubjectOptions(subjectId, options, requestSubjectOptions) + + response.code ?: throw IllegalStateException(response.message ?: "Null Error") + } + } diff --git a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt index 230db709..58bc4272 100644 --- a/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt +++ b/app/src/main/java/org/android/bbangzip/data/service/SubjectService.kt @@ -6,11 +6,9 @@ import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto import org.android.bbangzip.data.util.base.BaseResponse import retrofit2.http.Body -import retrofit2.http.DELETE import retrofit2.http.GET import retrofit2.http.HTTP import retrofit2.http.POST -import retrofit2.http.PUT import retrofit2.http.Path interface SubjectService { @@ -18,15 +16,19 @@ interface SubjectService { suspend fun getSubjectInfo(): BaseResponse @POST("/api/v1/subjects") - suspend fun postSubjectName(@Body requestAddSubjectsDto: RequestAddSubjectsDto): BaseResponse + suspend fun postSubjectName( + @Body requestAddSubjectsDto: RequestAddSubjectsDto, + ): BaseResponse @HTTP(method = "DELETE", path = "/api/v1/subjects", hasBody = true) - suspend fun deleteSubjects(@Body requestDeleteSubjectsDto: RequestDeleteSubjectsDto): BaseResponse + suspend fun deleteSubjects( + @Body requestDeleteSubjectsDto: RequestDeleteSubjectsDto, + ): BaseResponse @HTTP(method = "PUT", path = "/api/v1/subjects/{subjectId}/{options}", hasBody = true) suspend fun putSubjectOptions( @Path("subjectId") subjectId: Int, @Path("options") options: String, - @Body requestSubjectOptions: RequestSubjectOptions + @Body requestSubjectOptions: RequestSubjectOptions, ): BaseResponse } diff --git a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt index f3f717a6..dd804827 100644 --- a/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt +++ b/app/src/main/java/org/android/bbangzip/domain/repository/remote/SubjectRepository.kt @@ -3,7 +3,6 @@ package org.android.bbangzip.domain.repository.remote import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.data.dto.request.RequestSubjectOptions -import org.android.bbangzip.data.util.base.BaseResponse import org.android.bbangzip.domain.model.SubjectInfoEntity interface SubjectRepository { @@ -16,6 +15,6 @@ interface SubjectRepository { suspend fun putSubjectOptions( subjectId: Int, options: String, - requestSubjectOptions: RequestSubjectOptions + requestSubjectOptions: RequestSubjectOptions, ): Result } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt index 46b9d966..c322fd3b 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectScreen.kt @@ -56,7 +56,7 @@ fun SubjectScreen( onClickDeleteModeCard: (Int, String) -> Unit = { _, _ -> }, onClickStudyCard: (Int, String) -> Unit = { _, _ -> }, onClickAddSubject: () -> Unit = {}, - onClickDeleteBtn: ()-> Unit = {}, + onClickDeleteBtn: () -> Unit = {}, navigateAddStudy: (SplitStudyData) -> Unit, ) { val configuration = LocalConfiguration.current From 8f113e8fc1975bb0e8c38381cb2dd98482121a40 Mon Sep 17 00:00:00 2001 From: beom84 Date: Fri, 24 Jan 2025 16:40:16 +0900 Subject: [PATCH 22/25] =?UTF-8?q?[chore]=20#70=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/dto/request/RequestAddSubjectsDto.kt | 3 +- .../dto/request/RequestDeleteSubjectsDto.kt | 3 +- .../data/dto/request/RequestSubjectOptions.kt | 4 +- .../domain/usecase/DeleteSubjectsUseCase.kt | 4 +- .../usecase/PostAddSubjectNameUseCase.kt | 10 +- .../usecase/PutSubjectOptionsUseCase.kt | 8 +- .../ui/subject/SubjectViewModel.kt | 3 +- .../subject/addsubject/AddSubjectViewModel.kt | 31 ++- .../ModifyMotivationMessageContract.kt | 4 +- .../ModifyMotivationMessageRoute.kt | 4 +- .../ModifyMotivationMessageViewModel.kt | 208 +++++++++--------- .../subjectname/ModifySubjectNameViewModel.kt | 34 +-- .../subjectdetail/SubjectDetailRoute.kt | 58 ++--- 13 files changed, 186 insertions(+), 188 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt index c1bf35a2..0e99af73 100644 --- a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestAddSubjectsDto.kt @@ -2,7 +2,6 @@ package org.android.bbangzip.data.dto.request import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.io.Serial @Serializable data class RequestAddSubjectsDto( @@ -11,5 +10,5 @@ data class RequestAddSubjectsDto( @SerialName("year") val year: Int, @SerialName("semester") - val semester: String + val semester: String, ) diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt index 9ebbada3..d2d0d296 100644 --- a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestDeleteSubjectsDto.kt @@ -10,4 +10,5 @@ data class RequestDeleteSubjectsDto( @SerialName("year") val year: Int, @SerialName("semester") - val semester: String) + val semester: String, +) diff --git a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt index cb2a7616..3d654b9d 100644 --- a/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt +++ b/app/src/main/java/org/android/bbangzip/data/dto/request/RequestSubjectOptions.kt @@ -6,5 +6,5 @@ import kotlinx.serialization.Serializable @Serializable data class RequestSubjectOptions( @SerialName("value") - val value: String -) \ No newline at end of file + val value: String, +) diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt index 04d5f937..53b6c445 100644 --- a/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/DeleteSubjectsUseCase.kt @@ -4,8 +4,8 @@ import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.domain.repository.remote.SubjectRepository class DeleteSubjectsUseCase( - private val subjectRepository: SubjectRepository + private val subjectRepository: SubjectRepository, ) { suspend operator fun invoke(requestDeleteSubjectsDto: RequestDeleteSubjectsDto): Result = subjectRepository.deleteSubjects(requestDeleteSubjectsDto = requestDeleteSubjectsDto) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt index dbb266f3..3a5a744d 100644 --- a/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/PostAddSubjectNameUseCase.kt @@ -3,9 +3,9 @@ package org.android.bbangzip.domain.usecase import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto import org.android.bbangzip.domain.repository.remote.SubjectRepository -class PostAddSubjectNameUseCase ( - private val subjectRepository: SubjectRepository -){ +class PostAddSubjectNameUseCase( + private val subjectRepository: SubjectRepository, +) { suspend operator fun invoke(requestAddSubjectsDto: RequestAddSubjectsDto): Result = - subjectRepository.postSubjectName(requestAddSubjectsDto=requestAddSubjectsDto) -} \ No newline at end of file + subjectRepository.postSubjectName(requestAddSubjectsDto = requestAddSubjectsDto) +} diff --git a/app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt b/app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt index d23d115a..5d3968a9 100644 --- a/app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt +++ b/app/src/main/java/org/android/bbangzip/domain/usecase/PutSubjectOptionsUseCase.kt @@ -4,16 +4,16 @@ import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.domain.repository.remote.SubjectRepository class PutSubjectOptionsUseCase( - private val subjectRepository: SubjectRepository + private val subjectRepository: SubjectRepository, ) { suspend operator fun invoke( subjectId: Int, options: String, - requestSubjectOptions: RequestSubjectOptions + requestSubjectOptions: RequestSubjectOptions, ): Result = subjectRepository.putSubjectOptions( subjectId = subjectId, options = options, - requestSubjectOptions = requestSubjectOptions + requestSubjectOptions = requestSubjectOptions, ) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt index 58db07ab..21819561 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/SubjectViewModel.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.launch import org.android.bbangzip.data.dto.request.RequestDeleteSubjectsDto import org.android.bbangzip.domain.usecase.DeleteSubjectsUseCase import org.android.bbangzip.domain.usecase.GetSubjectInfoUseCase -import org.android.bbangzip.domain.usecase.PostAddSubjectNameUseCase import org.android.bbangzip.presentation.component.card.BbangZipCardState import org.android.bbangzip.presentation.model.card.SubjectCardModel import org.android.bbangzip.presentation.type.CardViewType @@ -183,7 +182,7 @@ class SubjectViewModel subjectIds = currentUiState.subjectSetToDelete.toList(), year = 2025, semester = "1학기", - ) + ), ) .onSuccess { Timber.tag("delete").d("성공") diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt index 7ad24170..5b4ddc55 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addsubject/AddSubjectViewModel.kt @@ -6,11 +6,8 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import org.android.bbangzip.data.dto.request.RequestAddSubjectsDto -import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.domain.usecase.PostAddSubjectNameUseCase -import org.android.bbangzip.domain.usecase.PutSubjectOptionsUseCase import org.android.bbangzip.presentation.model.BbangZipTextFieldInputState -import org.android.bbangzip.presentation.ui.subject.modify.motivationmessage.ModifyMotivationMessageContract import org.android.bbangzip.presentation.util.base.BaseViewModel import timber.log.Timber import javax.inject.Inject @@ -111,19 +108,19 @@ class AddSubjectViewModel } } - private suspend fun putMotivationMessage( - ) { - postAddSubjectNameUseCase( - requestAddSubjectsDto = RequestAddSubjectsDto( - subjectName = currentUiState.subjectName, - year = 2025, - semester = "1학기" - ) - ).onSuccess { - Timber.tag("motivate").d("과목명 저장") - setSideEffect(AddSubjectContract.AddSubjectSideEffect.NavigateSubjectDetail) - }.onFailure {error-> - Timber.tag("motivate").d(error) + private suspend fun putMotivationMessage() { + postAddSubjectNameUseCase( + requestAddSubjectsDto = + RequestAddSubjectsDto( + subjectName = currentUiState.subjectName, + year = 2025, + semester = "1학기", + ), + ).onSuccess { + Timber.tag("motivate").d("과목명 저장") + setSideEffect(AddSubjectContract.AddSubjectSideEffect.NavigateSubjectDetail) + }.onFailure { error -> + Timber.tag("motivate").d(error) + } } } - } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt index b7372c0c..24f154f6 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageContract.kt @@ -29,7 +29,7 @@ class ModifyMotivationMessageContract { data object OnClickDeleteBtn : ModifyMotivationMessageEvent - data class Initialize(val subjectId: Int,val subjectName: String) : ModifyMotivationMessageEvent + data class Initialize(val subjectId: Int, val subjectName: String) : ModifyMotivationMessageEvent } sealed interface ModifyMotivationMessageReduce : BaseContract.Reduce { @@ -43,7 +43,7 @@ class ModifyMotivationMessageContract { data object ResetSubjectNamge : ModifyMotivationMessageReduce - data class UpdateSubjectInfo(val subjectId: Int,val subjectName: String) : ModifyMotivationMessageReduce + data class UpdateSubjectInfo(val subjectId: Int, val subjectName: String) : ModifyMotivationMessageReduce } sealed interface ModifyMotivationMessageSideEffect : BaseContract.SideEffect { diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt index ce8fec02..8cdce176 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageRoute.kt @@ -17,7 +17,7 @@ import org.android.bbangzip.ui.theme.BbangZipTheme @Composable fun ModifyMotivationMessageRoute( subjectId: Int, - subjectName:String, + subjectName: String, viewModel: ModifyMotivationMessageViewModel = hiltViewModel(), navigateToSubjectDetail: (Int, String) -> Unit, snackbarHostState: SnackbarHostState, @@ -28,7 +28,7 @@ fun ModifyMotivationMessageRoute( activity.window.statusBarColor = BbangZipTheme.colors.staticWhite_FFFFFF.toArgb() - LaunchedEffect (Unit){ + LaunchedEffect(Unit) { viewModel.setEvent(ModifyMotivationMessageContract.ModifyMotivationMessageEvent.Initialize(subjectId, subjectName)) } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt index 250b6e80..16a49f31 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/motivationmessage/ModifyMotivationMessageViewModel.kt @@ -14,127 +14,129 @@ import javax.inject.Inject @HiltViewModel class ModifyMotivationMessageViewModel -@Inject -constructor( - private val putSubjectOptionsUseCase: PutSubjectOptionsUseCase, - savedStateHandle: SavedStateHandle, -) : BaseViewModel( - savedStateHandle = savedStateHandle, -) { - override fun createInitialState(savedState: Parcelable?): ModifyMotivationMessageContract.ModifyMotivationMessageState { - return savedState as? ModifyMotivationMessageContract.ModifyMotivationMessageState ?: ModifyMotivationMessageContract.ModifyMotivationMessageState() - } + @Inject + constructor( + private val putSubjectOptionsUseCase: PutSubjectOptionsUseCase, + savedStateHandle: SavedStateHandle, + ) : BaseViewModel( + savedStateHandle = savedStateHandle, + ) { + override fun createInitialState(savedState: Parcelable?): ModifyMotivationMessageContract.ModifyMotivationMessageState { + return savedState as? ModifyMotivationMessageContract.ModifyMotivationMessageState ?: ModifyMotivationMessageContract.ModifyMotivationMessageState() + } - override fun handleEvent(event: ModifyMotivationMessageContract.ModifyMotivationMessageEvent) { - when (event) { - is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnChangeMotivationMessage -> { - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage(motivationMessage = event.motivationMessage)) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) - } + override fun handleEvent(event: ModifyMotivationMessageContract.ModifyMotivationMessageEvent) { + when (event) { + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnChangeMotivationMessage -> { + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage(motivationMessage = event.motivationMessage)) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) + } - ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickBackBtn -> { - } + ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickBackBtn -> { + } - is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickModifyBtn -> { - viewModelScope.launch { - putMotivationMessage(event.subjectId,event.subjectName) + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickModifyBtn -> { + viewModelScope.launch { + putMotivationMessage(event.subjectId, event.subjectName) + } } - } - is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnFocusTextField -> { - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused(event.isTextFieldFocused)) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) - } + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnFocusTextField -> { + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused(event.isTextFieldFocused)) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) + } - ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickDeleteBtn -> { - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) - } + ModifyMotivationMessageContract.ModifyMotivationMessageEvent.OnClickDeleteBtn -> { + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState) + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled) + } - is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.Initialize -> - updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateSubjectInfo(event.subjectId, event.subjectName)) + is ModifyMotivationMessageContract.ModifyMotivationMessageEvent.Initialize -> + updateState(ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateSubjectInfo(event.subjectId, event.subjectName)) + } } - } - override fun reduceState( - state: ModifyMotivationMessageContract.ModifyMotivationMessageState, - reduce: ModifyMotivationMessageContract.ModifyMotivationMessageReduce, - ): ModifyMotivationMessageContract.ModifyMotivationMessageState { - return when (reduce) { - ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled -> { - state.copy( - isButtonEnable = state.motivationMessage.isNotEmpty() && state.motivationMessageTextFieldState != BbangZipTextFieldInputState.Alert, - ) - } + override fun reduceState( + state: ModifyMotivationMessageContract.ModifyMotivationMessageState, + reduce: ModifyMotivationMessageContract.ModifyMotivationMessageReduce, + ): ModifyMotivationMessageContract.ModifyMotivationMessageState { + return when (reduce) { + ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsButtonEnabled -> { + state.copy( + isButtonEnable = state.motivationMessage.isNotEmpty() && state.motivationMessageTextFieldState != BbangZipTextFieldInputState.Alert, + ) + } - is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused -> { - state.copy( - isTextFieldFocused = reduce.isTextFieldFocused, - ) - } + is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateIsTextFieldFocused -> { + state.copy( + isTextFieldFocused = reduce.isTextFieldFocused, + ) + } - is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage -> { - state.copy( - motivationMessage = reduce.motivationMessage, - ) - } + is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessage -> { + state.copy( + motivationMessage = reduce.motivationMessage, + ) + } - ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState -> { - state.copy( - motivationMessageTextFieldState = - determineTextFieldType( - state.motivationMessage, - state.isTextFieldFocused, - ), - ) - } + ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateMotivationMessageInputState -> { + state.copy( + motivationMessageTextFieldState = + determineTextFieldType( + state.motivationMessage, + state.isTextFieldFocused, + ), + ) + } - ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge -> { - state.copy( - motivationMessage = "", - ) - } + ModifyMotivationMessageContract.ModifyMotivationMessageReduce.ResetSubjectNamge -> { + state.copy( + motivationMessage = "", + ) + } - is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateSubjectInfo -> { - state.copy( - subjectId = reduce.subjectId, subjectName = reduce.subjectName - ) + is ModifyMotivationMessageContract.ModifyMotivationMessageReduce.UpdateSubjectInfo -> { + state.copy( + subjectId = reduce.subjectId, + subjectName = reduce.subjectName, + ) + } } } - } - private fun determineTextFieldType( - text: String, - isFocused: Boolean, - ): BbangZipTextFieldInputState { - return when { - text.isEmpty() && !isFocused -> BbangZipTextFieldInputState.Default - text.isEmpty() && isFocused -> BbangZipTextFieldInputState.Placeholder - text.contains(Regex("[\\p{So}\\p{Cn}]+")) -> BbangZipTextFieldInputState.Alert - text.isNotEmpty() && isFocused -> BbangZipTextFieldInputState.Typing - else -> BbangZipTextFieldInputState.Field + private fun determineTextFieldType( + text: String, + isFocused: Boolean, + ): BbangZipTextFieldInputState { + return when { + text.isEmpty() && !isFocused -> BbangZipTextFieldInputState.Default + text.isEmpty() && isFocused -> BbangZipTextFieldInputState.Placeholder + text.contains(Regex("[\\p{So}\\p{Cn}]+")) -> BbangZipTextFieldInputState.Alert + text.isNotEmpty() && isFocused -> BbangZipTextFieldInputState.Typing + else -> BbangZipTextFieldInputState.Field + } } - } - private suspend fun putMotivationMessage( - subjectId:Int, - subjectName:String - ) { - putSubjectOptionsUseCase( - subjectId = subjectId, - options = "motivationMessage", - requestSubjectOptions = RequestSubjectOptions( - value = currentUiState.motivationMessage - ) - ).onSuccess { - Timber.tag("motivate").d("각오 한 마디 저장") - setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.NavigateSubjectDetail(subjectId = subjectId, subjectName = subjectName)) - setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.ShowSnackBar("각오 한 마디 작성 완료!")) - }.onFailure {error-> - Timber.tag("motivate").d(error) + private suspend fun putMotivationMessage( + subjectId: Int, + subjectName: String, + ) { + putSubjectOptionsUseCase( + subjectId = subjectId, + options = "motivationMessage", + requestSubjectOptions = + RequestSubjectOptions( + value = currentUiState.motivationMessage, + ), + ).onSuccess { + Timber.tag("motivate").d("각오 한 마디 저장") + setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.NavigateSubjectDetail(subjectId = subjectId, subjectName = subjectName)) + setSideEffect(ModifyMotivationMessageContract.ModifyMotivationMessageSideEffect.ShowSnackBar("각오 한 마디 작성 완료!")) + }.onFailure { error -> + Timber.tag("motivate").d(error) + } } } -} diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt index 10fa78cb..49b1e29c 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/modify/subjectname/ModifySubjectNameViewModel.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.launch import org.android.bbangzip.data.dto.request.RequestSubjectOptions import org.android.bbangzip.domain.usecase.PutSubjectOptionsUseCase import org.android.bbangzip.presentation.model.BbangZipTextFieldInputState -import org.android.bbangzip.presentation.ui.subject.modify.motivationmessage.ModifyMotivationMessageContract import org.android.bbangzip.presentation.util.base.BaseViewModel import timber.log.Timber import javax.inject.Inject @@ -116,21 +115,22 @@ class ModifySubjectNameViewModel } } - private suspend fun putModifySubjectName( - subjectId:Int, - subjectName:String - ) { - putSubjectOptionsUseCase( - subjectId = subjectId, - options = "subjectName", - requestSubjectOptions = RequestSubjectOptions( - value = subjectName - ) - ).onSuccess { - Timber.tag("motivate").d("과목명 저장") - setSideEffect(ModifySubjectNameContract.ModifySubjectNameSideEffect.NavigationSubjectDetail(subjectId = subjectId, subjectName = subjectName)) - }.onFailure {error-> - Timber.tag("motivate").d(error) + private suspend fun putModifySubjectName( + subjectId: Int, + subjectName: String, + ) { + putSubjectOptionsUseCase( + subjectId = subjectId, + options = "subjectName", + requestSubjectOptions = + RequestSubjectOptions( + value = subjectName, + ), + ).onSuccess { + Timber.tag("motivate").d("과목명 저장") + setSideEffect(ModifySubjectNameContract.ModifySubjectNameSideEffect.NavigationSubjectDetail(subjectId = subjectId, subjectName = subjectName)) + }.onFailure { error -> + Timber.tag("motivate").d(error) + } } } - } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt index a9e472a7..f93712ad 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt @@ -54,39 +54,39 @@ fun SubjectDetailRoute( } } - when(success) { + when (success) { true -> - SubjectDetailScreen( - padding = padding, - isMenuOpen = subjectDetailState.isMenuOpen, - todoList = subjectDetailState.todoList, - pieceViewType = subjectDetailState.pieceViewType, - deletedSet = subjectDetailState.selectedItemSet, - revertCompleteBottomSheetState = subjectDetailState.revertCompleteBottomSheetState, - selectedItemId = subjectDetailState.selectedItemId, - subjectId = subjectDetailState.subjectId, - subjectName = subjectDetailState.subjectName, - motivationMessage = subjectDetailState.motivationMessage, - examDDay = subjectDetailState.examDday, - examDate = subjectDetailState.examDate, - onCloseIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCloseIconClicked) }, - onTrashIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnTrashIconClicked) }, - onDeleteModeCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDeleteModeCardClicked(id)) }, - onDefaultCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDefaultCardClicked(id)) }, - onCompleteCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCompleteCardClicked(id)) }, - onClickEnrollMotivationMessage = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickEnrollMotivateMessage(id, name)) }, - onClickModifySubjectName = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickModifySubjectName(id, name)) }, - onClickKebabMenu = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu) }, - onRevertCompleteBottomSheetDismissRequest = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDissmissRequest) }, - onRevertCompleteBottomSheetApproveButtonClicked = { pieceId -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetApproveButtonClicked(pieceId = pieceId)) }, - onRevertCompleteBottomSheetDismissButtonClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDismissButtonClicked) }, - ) + SubjectDetailScreen( + padding = padding, + isMenuOpen = subjectDetailState.isMenuOpen, + todoList = subjectDetailState.todoList, + pieceViewType = subjectDetailState.pieceViewType, + deletedSet = subjectDetailState.selectedItemSet, + revertCompleteBottomSheetState = subjectDetailState.revertCompleteBottomSheetState, + selectedItemId = subjectDetailState.selectedItemId, + subjectId = subjectDetailState.subjectId, + subjectName = subjectDetailState.subjectName, + motivationMessage = subjectDetailState.motivationMessage, + examDDay = subjectDetailState.examDday, + examDate = subjectDetailState.examDate, + onCloseIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCloseIconClicked) }, + onTrashIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnTrashIconClicked) }, + onDeleteModeCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDeleteModeCardClicked(id)) }, + onDefaultCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDefaultCardClicked(id)) }, + onCompleteCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCompleteCardClicked(id)) }, + onClickEnrollMotivationMessage = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickEnrollMotivateMessage(id, name)) }, + onClickModifySubjectName = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickModifySubjectName(id, name)) }, + onClickKebabMenu = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu) }, + onRevertCompleteBottomSheetDismissRequest = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDissmissRequest) }, + onRevertCompleteBottomSheetApproveButtonClicked = { pieceId -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetApproveButtonClicked(pieceId = pieceId)) }, + onRevertCompleteBottomSheetDismissButtonClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDismissButtonClicked) }, + ) false -> Box( modifier = - Modifier - .fillMaxSize() - .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), + Modifier + .fillMaxSize() + .background(color = BbangZipTheme.colors.staticWhite_FFFFFF), contentAlignment = Alignment.Center, ) { CircularProgressIndicator(color = BbangZipTheme.colors.backgroundAccent_FFDAA0) From 8967f39220ca6494eaf5d9e845c44fb623b7fef9 Mon Sep 17 00:00:00 2001 From: kamja0510 Date: Fri, 24 Jan 2025 17:51:04 +0900 Subject: [PATCH 23/25] =?UTF-8?q?[feat]=20#66=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/model/AddStudyData.kt | 1 + .../presentation/model/SplitStudyData.kt | 1 + .../presentation/ui/navigator/MainNavHost.kt | 1 + .../ui/subject/addstudy/AddStudyContract.kt | 1 + .../ui/subject/addstudy/AddStudyRoute.kt | 1 + .../ui/subject/addstudy/AddStudyScreen.kt | 3 ++ .../ui/subject/addstudy/AddStudyViewModel.kt | 13 ++++--- .../subject/splitstudy/SplitStudyContract.kt | 1 + .../ui/subject/splitstudy/SplitStudyRoute.kt | 1 + .../ui/subject/splitstudy/SplitStudyScreen.kt | 7 ++-- .../subject/splitstudy/SplitStudyViewModel.kt | 2 ++ .../subjectdetail/SubjectDetailContract.kt | 10 ++++-- .../subjectdetail/SubjectDetailNavigation.kt | 3 ++ .../subjectdetail/SubjectDetailRoute.kt | 7 +++- .../subjectdetail/SubjectDetailViewModel.kt | 15 ++++++-- .../subjectdetail/SubjectDetatilScreen.kt | 35 +++++++++++++++++-- 16 files changed, 87 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt b/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt index 4c8b6070..35d009df 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/model/AddStudyData.kt @@ -10,6 +10,7 @@ data class AddStudyData( val subjectName: String, val pieceNumber: Int, val examDate: String, + val examName: String, val studyContent: String, val startPage: String, val endPage: String, diff --git a/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt b/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt index d5c9be7e..fe4f93e5 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/model/SplitStudyData.kt @@ -11,6 +11,7 @@ data class SplitStudyData( val subjectName: String, val pieceNumber: Int, val examDate: String, + val examName: String, val studyContent: String, val startPage: String, val endPage: String, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt index 9110c6d4..9a1b7645 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt @@ -147,6 +147,7 @@ fun MainNavHost( navigateToBack = { navigator.popBackStackIfNotSubject() }, navigateToModifyMotivation = { id, name -> navigator.navigateToModifyMotivationMessage(id, name) }, navigateToModifySubjectName = { id, name -> navigator.navigateToModifySubjectName(id, name) }, + navigateToAddStudy = {splitStudyData -> navigator.navigateToAddStudy(splitStudyData)} ) todoNavGraph( diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt index f2b8092f..320d62ae 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyContract.kt @@ -14,6 +14,7 @@ class AddStudyContract { data class AddStudyState( val subjectName: String = "", val examDate: String = "시험 일자 입력", + val examName: String = "", val selectedDate: Date = Date("2025", "1", "21"), val studyContent: String? = null, val studyContentTextFieldState: BbangZipTextFieldInputState = BbangZipTextFieldInputState.Default, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt index de7a5c6f..6e237485 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyRoute.kt @@ -39,6 +39,7 @@ fun AddStudyRoute( pieceNumber = addStudyState.pieceNumber, subjectTitle = addStudyState.subjectName, examDate = addStudyState.examDate, + examName = addStudyState.examName, studyContent = addStudyState.studyContent ?: "", startPage = addStudyState.startPage ?: "", startGuideline = addStudyState.startPageGuideline, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyScreen.kt index 5b2dc4f5..cc425d0a 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyScreen.kt @@ -49,6 +49,7 @@ fun AddStudyScreen( pieceNumber: Int, subjectTitle: String = "", examDate: String = "", + examName: String = "", studyContent: String = "", startPage: String = "", startGuideline: String = "", @@ -80,6 +81,8 @@ fun AddStudyScreen( ) { val focusManager = LocalFocusManager.current + Timber.tag("김재민").d("AddStudyScreenExamName : $examName") + Column( modifier = Modifier diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt index fbd66b55..a67b6ccd 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt @@ -9,6 +9,7 @@ import org.android.bbangzip.presentation.type.AddStudyViewType import org.android.bbangzip.presentation.ui.subject.addstudy.AddStudyContract.AddStudyReduce import org.android.bbangzip.presentation.util.base.BaseViewModel import org.android.bbangzip.presentation.util.casting.pageToInt +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -93,6 +94,7 @@ class AddStudyViewModel updateState(AddStudyReduce.UpdateAddStudyViewType) updateState(AddStudyReduce.UpdatePieceNumber(pieceNumber = event.pieceNumber)) updateState(AddStudyReduce.UpdatePiecePickerBottomSheetState) + Timber.tag("김재민").d("addstudy에서 보내는 값${currentUiState}") setSideEffect( AddStudyContract.AddStudySideEffect.NavigateSplitStudy( addStudyData = @@ -103,8 +105,9 @@ class AddStudyViewModel studyContent = currentUiState.studyContent ?: "", startPage = currentUiState.startPage ?: "", endPage = currentUiState.endPage ?: "", - startPageList = divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(0, event.pieceNumber), - endPageList = divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(1, event.pieceNumber + 1), + startPageList = if(currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.startPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(0, event.pieceNumber), + endPageList = if(currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.endPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(1, event.pieceNumber + 1), + examName = currentUiState.examName ), ), ) @@ -128,8 +131,9 @@ class AddStudyViewModel studyContent = currentUiState.studyContent ?: "", startPage = currentUiState.startPage ?: "", endPage = currentUiState.endPage ?: "", - startPageList = divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(0, event.pieceNumber), - endPageList = divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(1, event.pieceNumber + 1), + startPageList = currentUiState.startPageList, + endPageList = currentUiState.endPageList, + examName = currentUiState.examName ), ), ) @@ -147,6 +151,7 @@ class AddStudyViewModel subjectName = reduce.splitStudyData.subjectName, pieceNumber = reduce.splitStudyData.pieceNumber, examDate = reduce.splitStudyData.examDate, + examName = reduce.splitStudyData.examName, studyContent = reduce.splitStudyData.studyContent, startPage = reduce.splitStudyData.startPage, endPage = reduce.splitStudyData.endPage, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt index 3cb8133e..9a37448b 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyContract.kt @@ -16,6 +16,7 @@ class SplitStudyContract { val startPage: String = "", val endPage: String = "", val examDate: String = "", + val examName: String = "", val studyContent: String = "", val pieceNumber: Int = 0, val selectedDate: Date = Date("2025", "1", "21"), diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt index a7684c0e..33d396b3 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyRoute.kt @@ -40,6 +40,7 @@ fun SplitStudyRoute( pieceNumber = splitStudyState.pieceNumber, subjectName = splitStudyState.subjectName, examDate = splitStudyState.examDate, + examName = splitStudyState.examName, studyContent = splitStudyState.studyContent, startPage = splitStudyState.startPage, endPage = splitStudyState.endPage, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt index 1051efe9..cc0ee4ea 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyScreen.kt @@ -53,6 +53,7 @@ fun SplitStudyScreen( startPage: String = "", endPage: String = "", examDate: String = "", + examName: String = "", studyContent: String = "", selectedIndex: Int = 0, selectedDate: Date = Date("2025", "1", "21"), @@ -88,8 +89,7 @@ fun SplitStudyScreen( ) { val focusManager = LocalFocusManager.current - Timber.tag("지은아자지마").d("pieceNumber : $pieceNumber") - Timber.tag("[과목 관리]").d(startPageGuidelineList.toString()) + Timber.tag("김재민").d("examName : $examName") val scrollState = rememberLazyListState() val isShadowed by remember { @@ -164,7 +164,7 @@ fun SplitStudyScreen( Spacer(modifier = Modifier.width(4.dp)) Text( - text = "까지", + text = "부터", style = BbangZipTheme.typography.label1Bold, color = BbangZipTheme.colors.labelAlternative_282119_61, ) @@ -281,6 +281,7 @@ fun SplitStudyScreen( subjectName = subjectName, pieceNumber = pieceNumber, examDate = examDate, + examName = examName, studyContent = studyContent, startPage = startPage, endPage = endPage, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt index f6b7c634..e34ab2fb 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt @@ -149,6 +149,7 @@ class SplitStudyViewModel pieceNumber = reduce.addStudyData.pieceNumber, startPageList = reduce.addStudyData.startPageList, endPageList = reduce.addStudyData.endPageList, + examName = reduce.addStudyData.examName, dateList = divideDatesByN(dateStringToLocalDate(reduce.addStudyData.examDate), reduce.addStudyData.pieceNumber).map { localDateToDate(it) }, startPageFocusedStateList = List(reduce.addStudyData.pieceNumber) { false }, @@ -304,6 +305,7 @@ class SplitStudyViewModel startPage = event.splitStudyData.startPage, endPage = event.splitStudyData.endPage, addStudyViewType = event.splitStudyData.addStudyViewType, + examName = event.splitStudyData.examName ), ), ) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailContract.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailContract.kt index 6008ad59..e2ccbe57 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailContract.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailContract.kt @@ -3,6 +3,7 @@ package org.android.bbangzip.presentation.ui.subject.subjectdetail import android.os.Parcelable import kotlinx.parcelize.Parcelize import org.android.bbangzip.presentation.component.card.BbangZipCardState +import org.android.bbangzip.presentation.model.SplitStudyData import org.android.bbangzip.presentation.model.SubjectDetailInfo import org.android.bbangzip.presentation.model.card.ToDoCardModel import org.android.bbangzip.presentation.type.PieceViewType @@ -22,6 +23,7 @@ class SubjectDetailContract { val motivationMessage: String = "사장님의 각오 한마디를 작성해보세요", val selectedItemId: Int = -1, val subjectId: Int = 0, + val examName: String = "중간고사", val subjectName: String = "", val todoList: List = listOf( @@ -146,7 +148,7 @@ class SubjectDetailContract { val subjectName: String, ) : SubjectDetailEvent - data object OnPlusIconClicked : SubjectDetailEvent + data class OnPlusIconClicked(val splitStudyData: SplitStudyData) : SubjectDetailEvent data object OnTrashIconClicked : SubjectDetailEvent @@ -162,6 +164,8 @@ class SubjectDetailContract { data object OnClickKebabMenu : SubjectDetailEvent + data class OnClickTab(val index: Int) : SubjectDetailEvent + data class OnClickEnrollMotivateMessage( val subjectId: Int, val subjectName: String, @@ -212,12 +216,14 @@ class SubjectDetailContract { data class UpdateSelectedId(val pieceId: Int) : SubjectDetailReduce data object UpdateIsMenuOpen : SubjectDetailReduce + + data class UpdateExamName(val index: Int) : SubjectDetailReduce } sealed interface SubjectDetailSideEffect : BaseContract.SideEffect { data object NavigateToAddSubject : SubjectDetailSideEffect - data object NavigateToAddStudy : SubjectDetailSideEffect + data class NavigateToAddStudy(val splitStudyData: SplitStudyData) : SubjectDetailSideEffect data class NavigateToModifyMotivation(val subjectId: Int, val subjectName: String) : SubjectDetailSideEffect diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt index 8dd0e6a8..94878308 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt @@ -6,6 +6,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.toRoute import kotlinx.serialization.Serializable +import org.android.bbangzip.presentation.model.SplitStudyData fun NavController.navigateToSubjectDetail( subjectId: Int, @@ -25,6 +26,7 @@ fun NavGraphBuilder.subjectDetailNavGraph( navigateToBack: () -> Unit = {}, navigateToModifyMotivation: (Int, String) -> Unit = { _, _ -> }, navigateToModifySubjectName: (Int, String) -> Unit = { _, _ -> }, + navigateToAddStudy: (SplitStudyData) -> Unit = {}, ) { composable { backStackEntry -> SubjectDetailRoute( @@ -34,6 +36,7 @@ fun NavGraphBuilder.subjectDetailNavGraph( navigateToBack = navigateToBack, navigateToModifyMotivation = navigateToModifyMotivation, navigateToModifySubjectName = navigateToModifySubjectName, + navigateToAddStudy = navigateToAddStudy ) } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt index ec8f1033..d43e978e 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt @@ -7,6 +7,7 @@ import androidx.compose.runtime.getValue import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.flow.collectLatest +import org.android.bbangzip.presentation.model.SplitStudyData @Composable fun SubjectDetailRoute( @@ -16,6 +17,7 @@ fun SubjectDetailRoute( navigateToBack: () -> Unit, navigateToModifyMotivation: (Int, String) -> Unit, navigateToModifySubjectName: (Int, String) -> Unit, + navigateToAddStudy: (SplitStudyData) -> Unit, viewModel: SubjectDetailViewModel = hiltViewModel(), ) { val subjectDetailState by viewModel.uiState.collectAsStateWithLifecycle() @@ -30,7 +32,7 @@ fun SubjectDetailRoute( // navigateToModifyMotivation() } is SubjectDetailContract.SubjectDetailSideEffect.NavigateToAddStudy -> { -// navigateToModifySubjectName("") + navigateToAddStudy(effect.splitStudyData) } is SubjectDetailContract.SubjectDetailSideEffect.ShowDeleteSuccessSnackBar -> { } @@ -59,6 +61,8 @@ fun SubjectDetailRoute( motivationMessage = subjectDetailState.motivationMessage, examDDay = subjectDetailState.examDday, examDate = subjectDetailState.examDate, + examName = subjectDetailState.examName, + onClickTab = { index -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickTab(index)) }, onCloseIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnCloseIconClicked) }, onTrashIconClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnTrashIconClicked) }, onDeleteModeCardClicked = { id -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnDeleteModeCardClicked(id)) }, @@ -67,6 +71,7 @@ fun SubjectDetailRoute( onClickEnrollMotivationMessage = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickEnrollMotivateMessage(id, name)) }, onClickModifySubjectName = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickModifySubjectName(id, name)) }, onClickKebabMenu = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu) }, + onClickAddStudy = { splitStudyData -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnPlusIconClicked(splitStudyData)) }, onRevertCompleteBottomSheetDismissRequest = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDissmissRequest) }, onRevertCompleteBottomSheetApproveButtonClicked = { pieceId -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetApproveButtonClicked(pieceId = pieceId)) }, onRevertCompleteBottomSheetDismissButtonClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDismissButtonClicked) }, diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt index 93f0825e..1b41b2c3 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailViewModel.kt @@ -90,13 +90,18 @@ class SubjectDetailViewModel setSideEffect(SubjectDetailContract.SubjectDetailSideEffect.NavigateToModifySubjectName(subjectId = event.subjectId, subjectName = event.subjectName)) } SubjectDetailContract.SubjectDetailEvent.OnDeleteButtonClicked -> {} - SubjectDetailContract.SubjectDetailEvent.OnPlusIconClicked -> { - // Todo + is SubjectDetailContract.SubjectDetailEvent.OnPlusIconClicked -> { + Timber.tag("김재민").d("되나?") + setSideEffect(SubjectDetailContract.SubjectDetailSideEffect.NavigateToAddStudy(splitStudyData = event.splitStudyData)) } SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu -> { updateState(SubjectDetailContract.SubjectDetailReduce.UpdateIsMenuOpen) } + + is SubjectDetailContract.SubjectDetailEvent.OnClickTab -> { + updateState(SubjectDetailContract.SubjectDetailReduce.UpdateExamName(event.index)) + } } } @@ -229,6 +234,12 @@ class SubjectDetailViewModel isMenuOpen = !state.isMenuOpen, ) } + + is SubjectDetailContract.SubjectDetailReduce.UpdateExamName -> { + state.copy( + examName = if (reduce.index == 0) "중간고사" else "기말고사", + ) + } } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index 7ac17fb8..66400d4d 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -51,7 +51,9 @@ import org.android.bbangzip.presentation.component.button.BbangZipButton import org.android.bbangzip.presentation.component.card.BbangZipCardState import org.android.bbangzip.presentation.component.card.ToDoCard import org.android.bbangzip.presentation.component.topbar.BbangZipBaseTopBar +import org.android.bbangzip.presentation.model.SplitStudyData import org.android.bbangzip.presentation.model.card.ToDoCardModel +import org.android.bbangzip.presentation.type.AddStudyViewType import org.android.bbangzip.presentation.type.BbangZipButtonSize import org.android.bbangzip.presentation.type.BbangZipButtonType import org.android.bbangzip.presentation.type.BbangZipShadowType @@ -77,6 +79,7 @@ fun SubjectDetailScreen( motivationMessage: String, examDDay: Int, examDate: String, + examName: String, onRevertCompleteBottomSheetDismissButtonClicked: () -> Unit = {}, onRevertCompleteBottomSheetApproveButtonClicked: (Int) -> Unit = {}, onRevertCompleteBottomSheetDismissRequest: () -> Unit = {}, @@ -87,9 +90,12 @@ fun SubjectDetailScreen( onClickEnrollMotivationMessage: (Int, String) -> Unit = { _, _ -> }, onClickModifySubjectName: (Int, String) -> Unit = { _, _ -> }, onClickKebabMenu: () -> Unit = {}, + onClickTab: (Int) -> Unit = {}, + onClickAddStudy: (SplitStudyData) -> Unit = {}, onDefaultCardClicked: (Int) -> Unit = {}, onCompleteCardClicked: (Int) -> Unit = {}, ) { + Timber.tag("김재민").d("SubjectDetailScreen : $subjectName $examName") val configuration = LocalConfiguration.current val screenHeightDp = configuration.screenHeightDp val backgroundHeight = (screenHeightDp * 0.32).toInt() @@ -103,6 +109,19 @@ fun SubjectDetailScreen( val tabs = listOf("중간고사", "기말고사") var selectedIndex by remember { mutableIntStateOf(0) } + val splitStudyData = SplitStudyData( + subjectName = subjectName, + pieceNumber = 0, + examDate = "시험 일자 입력", + examName = examName, + studyContent = "", + startPage = "", + endPage = "", + startPageList = emptyList(), + endPageList = emptyList(), + deadLineList = emptyList(), + addStudyViewType = AddStudyViewType.DEFAULT + ) Timber.d("${deletedSet.size}") Box( @@ -172,7 +191,10 @@ fun SubjectDetailScreen( examTab( text = tabName, isSelected = selectedIndex == index, - onClick = { selectedIndex = index }, + onClick = { + onClickTab(index) + selectedIndex = index + }, ) } } @@ -193,6 +215,8 @@ fun SubjectDetailScreen( onCompleteCardClicked = onCompleteCardClicked, dDay = examDDay.toString(), examDay = examDate, + splitStudyData = splitStudyData, + onClickAddStudy = onClickAddStudy ) } PieceViewType.DELETE -> { @@ -303,9 +327,11 @@ private fun DefaultPieceView( todoList: List, dDay: String, examDay: String, + splitStudyData: SplitStudyData, onTrashIconClicked: () -> Unit = {}, onDefaultCardClicked: (Int) -> Unit, onCompleteCardClicked: (Int) -> Unit, + onClickAddStudy: (SplitStudyData) -> Unit = {}, ) { Column( modifier = @@ -378,7 +404,9 @@ private fun DefaultPieceView( .applyFilterOnClick( radius = 20.dp, isDisabled = false, - ) { } + ) { + onClickAddStudy(splitStudyData) + } .padding(8.dp), tint = BbangZipTheme.colors.labelAlternative_282119_61, ) @@ -410,7 +438,7 @@ private fun DefaultPieceView( .applyFilterOnClick( radius = 24.dp, isDisabled = false, - ) { }, + ) {onClickAddStudy(splitStudyData) }, ) { Row( modifier = @@ -723,5 +751,6 @@ private fun SubjectDetailScreenPreview() { motivationMessage = "사장님의 각오 한마디를 작성해보세요", examDate = "2025년 1월 1일", examDDay = 14, + examName = "중간고사" ) } From af812c2ff9161e754e750cc3a6a28c961a63a0a3 Mon Sep 17 00:00:00 2001 From: kamja0510 Date: Fri, 24 Jan 2025 18:26:36 +0900 Subject: [PATCH 24/25] =?UTF-8?q?[feat]=20#66=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt index 9129655f..6bb451ce 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt @@ -108,6 +108,7 @@ fun SubjectDetailRoute( onClickEnrollMotivationMessage = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickEnrollMotivateMessage(id, name)) }, onClickModifySubjectName = { id, name -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickModifySubjectName(id, name)) }, onClickKebabMenu = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnClickKebabMenu) }, + onClickAddStudy = { splitStudyData -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnPlusIconClicked(splitStudyData)) }, onRevertCompleteBottomSheetDismissRequest = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDissmissRequest) }, onRevertCompleteBottomSheetApproveButtonClicked = { pieceId -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetApproveButtonClicked(pieceId = pieceId)) }, onRevertCompleteBottomSheetDismissButtonClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDismissButtonClicked) }, From a8ad70af9c1e1619a21d234ac828aeca6238e71b Mon Sep 17 00:00:00 2001 From: kamja0510 Date: Fri, 24 Jan 2025 18:32:39 +0900 Subject: [PATCH 25/25] [chore] #74 ktlint --- .../presentation/ui/navigator/MainNavHost.kt | 2 +- .../ui/subject/addstudy/AddStudyViewModel.kt | 10 +++--- .../subject/splitstudy/SplitStudyViewModel.kt | 2 +- .../subjectdetail/SubjectDetailNavigation.kt | 2 +- .../subjectdetail/SubjectDetailRoute.kt | 1 - .../subjectdetail/SubjectDetatilScreen.kt | 35 ++++++++++--------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt index 9a1b7645..7c969123 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/navigator/MainNavHost.kt @@ -147,7 +147,7 @@ fun MainNavHost( navigateToBack = { navigator.popBackStackIfNotSubject() }, navigateToModifyMotivation = { id, name -> navigator.navigateToModifyMotivationMessage(id, name) }, navigateToModifySubjectName = { id, name -> navigator.navigateToModifySubjectName(id, name) }, - navigateToAddStudy = {splitStudyData -> navigator.navigateToAddStudy(splitStudyData)} + navigateToAddStudy = { splitStudyData -> navigator.navigateToAddStudy(splitStudyData) }, ) todoNavGraph( diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt index a67b6ccd..148d68ae 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/addstudy/AddStudyViewModel.kt @@ -94,7 +94,7 @@ class AddStudyViewModel updateState(AddStudyReduce.UpdateAddStudyViewType) updateState(AddStudyReduce.UpdatePieceNumber(pieceNumber = event.pieceNumber)) updateState(AddStudyReduce.UpdatePiecePickerBottomSheetState) - Timber.tag("김재민").d("addstudy에서 보내는 값${currentUiState}") + Timber.tag("김재민").d("addstudy에서 보내는 값$currentUiState") setSideEffect( AddStudyContract.AddStudySideEffect.NavigateSplitStudy( addStudyData = @@ -105,9 +105,9 @@ class AddStudyViewModel studyContent = currentUiState.studyContent ?: "", startPage = currentUiState.startPage ?: "", endPage = currentUiState.endPage ?: "", - startPageList = if(currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.startPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(0, event.pieceNumber), - endPageList = if(currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.endPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(1, event.pieceNumber + 1), - examName = currentUiState.examName + startPageList = if (currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.startPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(0, event.pieceNumber), + endPageList = if (currentUiState.addStudyViewType == AddStudyViewType.AGAIN) currentUiState.endPageList else divideRangeIntoInts(currentUiState.startPage!!.filter { it.isDigit() }.toInt(), currentUiState.endPage!!.filter { it.isDigit() }.toInt(), event.pieceNumber).map { it.toString() }.subList(1, event.pieceNumber + 1), + examName = currentUiState.examName, ), ), ) @@ -133,7 +133,7 @@ class AddStudyViewModel endPage = currentUiState.endPage ?: "", startPageList = currentUiState.startPageList, endPageList = currentUiState.endPageList, - examName = currentUiState.examName + examName = currentUiState.examName, ), ), ) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt index e34ab2fb..96dac44b 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/splitstudy/SplitStudyViewModel.kt @@ -305,7 +305,7 @@ class SplitStudyViewModel startPage = event.splitStudyData.startPage, endPage = event.splitStudyData.endPage, addStudyViewType = event.splitStudyData.addStudyViewType, - examName = event.splitStudyData.examName + examName = event.splitStudyData.examName, ), ), ) diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt index 94878308..7aa7b733 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailNavigation.kt @@ -36,7 +36,7 @@ fun NavGraphBuilder.subjectDetailNavGraph( navigateToBack = navigateToBack, navigateToModifyMotivation = navigateToModifyMotivation, navigateToModifySubjectName = navigateToModifySubjectName, - navigateToAddStudy = navigateToAddStudy + navigateToAddStudy = navigateToAddStudy, ) } } diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt index 6bb451ce..1e9706a3 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetailRoute.kt @@ -112,7 +112,6 @@ fun SubjectDetailRoute( onRevertCompleteBottomSheetDismissRequest = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDissmissRequest) }, onRevertCompleteBottomSheetApproveButtonClicked = { pieceId -> viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetApproveButtonClicked(pieceId = pieceId)) }, onRevertCompleteBottomSheetDismissButtonClicked = { viewModel.setEvent(SubjectDetailContract.SubjectDetailEvent.OnRevertCompleteBottomSheetDismissButtonClicked) }, - ) false -> Box( diff --git a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt index 0af19d34..4606caf2 100644 --- a/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt +++ b/app/src/main/java/org/android/bbangzip/presentation/ui/subject/subjectdetail/SubjectDetatilScreen.kt @@ -109,19 +109,20 @@ fun SubjectDetailScreen( val tabs = listOf("중간고사", "기말고사") var selectedIndex by remember { mutableIntStateOf(0) } - val splitStudyData = SplitStudyData( - subjectName = subjectName, - pieceNumber = 0, - examDate = "시험 일자 입력", - examName = examName, - studyContent = "", - startPage = "", - endPage = "", - startPageList = emptyList(), - endPageList = emptyList(), - deadLineList = emptyList(), - addStudyViewType = AddStudyViewType.DEFAULT - ) + val splitStudyData = + SplitStudyData( + subjectName = subjectName, + pieceNumber = 0, + examDate = "시험 일자 입력", + examName = examName, + studyContent = "", + startPage = "", + endPage = "", + startPageList = emptyList(), + endPageList = emptyList(), + deadLineList = emptyList(), + addStudyViewType = AddStudyViewType.DEFAULT, + ) Timber.d("${deletedSet.size}") Box( @@ -194,7 +195,7 @@ fun SubjectDetailScreen( onClick = { onClickTab(index) selectedIndex = index - }, + }, ) } } @@ -216,7 +217,7 @@ fun SubjectDetailScreen( dDay = examDDay.toString(), examDay = examDate, splitStudyData = splitStudyData, - onClickAddStudy = onClickAddStudy + onClickAddStudy = onClickAddStudy, ) } PieceViewType.DELETE -> { @@ -438,7 +439,7 @@ private fun DefaultPieceView( .applyFilterOnClick( radius = 24.dp, isDisabled = false, - ) {onClickAddStudy(splitStudyData) }, + ) { onClickAddStudy(splitStudyData) }, ) { Row( modifier = @@ -751,6 +752,6 @@ private fun SubjectDetailScreenPreview() { motivationMessage = "사장님의 각오 한마디를 작성해보세요", examDate = "2025년 1월 1일", examDDay = 14, - examName = "중간고사" + examName = "중간고사", ) }