From 66543dd7a90e04a9cab630bb1d18a323bc357821 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Mon, 1 Sep 2025 21:00:47 +0900 Subject: [PATCH 01/12] =?UTF-8?q?Add:=20=EA=B5=AC=EC=8A=AC=20=EA=B0=90?= =?UTF-8?q?=EC=A0=95=20=ED=99=94=EB=A9=B4=EC=97=90=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable-hdpi/img_pomo_hand.png | Bin 0 -> 4689 bytes .../main/res/drawable-hdpi/img_pomo_thumb.png | Bin 0 -> 1881 bytes .../main/res/drawable-mdpi/img_pomo_hand.png | Bin 0 -> 3040 bytes .../main/res/drawable-mdpi/img_pomo_thumb.png | Bin 0 -> 1250 bytes .../main/res/drawable-xhdpi/img_pomo_hand.png | Bin 0 -> 6393 bytes .../res/drawable-xhdpi/img_pomo_thumb.png | Bin 0 -> 2485 bytes .../res/drawable-xxhdpi/img_pomo_hand.png | Bin 0 -> 10215 bytes .../res/drawable-xxhdpi/img_pomo_thumb.png | Bin 0 -> 3700 bytes .../res/drawable-xxxhdpi/img_pomo_hand.png | Bin 0 -> 14427 bytes .../res/drawable-xxxhdpi/img_pomo_thumb.png | Bin 0 -> 5250 bytes .../res/drawable/ic_double_down_arrow_24.xml | 20 ++++++++++++++++++ 11 files changed, 20 insertions(+) create mode 100644 core/designsystem/src/main/res/drawable-hdpi/img_pomo_hand.png create mode 100644 core/designsystem/src/main/res/drawable-hdpi/img_pomo_thumb.png create mode 100644 core/designsystem/src/main/res/drawable-mdpi/img_pomo_hand.png create mode 100644 core/designsystem/src/main/res/drawable-mdpi/img_pomo_thumb.png create mode 100644 core/designsystem/src/main/res/drawable-xhdpi/img_pomo_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xhdpi/img_pomo_thumb.png create mode 100644 core/designsystem/src/main/res/drawable-xxhdpi/img_pomo_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xxhdpi/img_pomo_thumb.png create mode 100644 core/designsystem/src/main/res/drawable-xxxhdpi/img_pomo_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xxxhdpi/img_pomo_thumb.png create mode 100644 core/designsystem/src/main/res/drawable/ic_double_down_arrow_24.xml diff --git a/core/designsystem/src/main/res/drawable-hdpi/img_pomo_hand.png b/core/designsystem/src/main/res/drawable-hdpi/img_pomo_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..0ade69b219a6cad40476605ee12cb78b4b469ad3 GIT binary patch literal 4689 zcmX9?c|6qJ_y5e;Ne0D(WRMUc%-FIFlBTjRW1m4ohE&!EqmeC@B_UDPY>%-u29Y72 z>|2bXk)`xx9STGC-}L?cabM@0_vhSm&gXpYx%Zw=l9k0(eqM22008)}nVZ@G00_q# zlH8muq)*@M4U6#HHFpXE0LZI919W~+SCa*Tf^4oD1Jy%kmRJJ258@^Q0P0ft4lo=5 zAo$~&DZ(xs#F$piJ=0C@{*^Do#`Vz?bAhDRuRIVSf_>>$`cC;qpVA~#DQ#V8lK;Iq z9QiOb?i*B2*~u`T+6-VyC-fCfbnKnvMxUQUD z^~gyuu!WW5=Nr~idg=oPUNKGk2TLuJSvnSP3!>+}A(Oye(~&)m<<4Km)H=|dJYr?M ze3*Zq0tW+&H5+2o{du#2x1dw2?+&;^w1_uM8o3GIToqmy%t(oX3C5_o639SVS0(@r zvdnN$)9B>1Iy3b;8~N9c7z@)tM7wMyq`U?WzEje4^%}N@`)UpckKA{tXB&Be-s^=g zA{J}2C{V!M71>HP=}rcq7*V8BaQ6xL0AN09TXMR=i|aoK(A!&erDnZJ&`PZtF)Ebv zi%YVt2_9A`W~e!@2OG;u{!y$d*nGT7G{R`y4<+AE~ktN$ma{p8}Cn%e0vBbV)6Falgc!A$z zxE9?AG%jpD15PwNTOV=7ec?s~j9BcxU!z8+^MN5BjeD;fMMz}!dCL{>4L-mfCewS3 zAp|{+T|RTmd0ghLiZlawwW%+gyp!ZThSAn#q_gjro^E=)zs9IHXECBA*PFmd#M#cCm6-o;w#*VpsKy2af{#lP61AZtEwSbjK6GC<(_4h8cN@jX@?V8MIBUP`i#d(dWa3 z;}lU=f!|F^wnMYhU6VMvuL;tQeuDFdM4dgXUWR;uhHA+KO(0k1RiwJtL#yiZY81J` zZdp8f3A?|8TKTLwpVW5?G1!_SEKNMboL9fd*AL4ZgEq_D=nZsuE<-%rbQ_%O!3@yQ#WfDLe_NeLrBYBzF%_z3}aX|?p;*r-)_8RR*h$u z^5*zkC_k9@H2em=awU@9q0ife%G9x`Q=B>S9_WAbz?%}MSB zyAE_5Sv8J%@FOB+p*nGaAVLx3#(7-8+(C?0n)196I4>&;p;1P7)Z27u9B^Z)?e|<5 zNC*7|R2kD(d$NdKD3)U@h81u5Xt2NV4alAhkxPbXT~rY&#%T>sIvt1j-!o0p%5^~l z6gP&^KO0x_wDqIhqadS%f)nZx4CDGm<&x1Rp{^1&QwXOtE8NQ3Hw)tMF+NWReY^i5 z(!>|At!T6ARq+&fH_MraGVz^Sn3G9^k+62>X9;gP)A>hs58RUi-d!gZ>+MsnIZwV9 z>6(Pk2TAj4;Gor~IwY3DGqc^U$`TKyPh^SO@)k1v#g#|QWQcg_@(ID9LZ##6(ho3? zX9j5xrmwlB-sx7|ir%->{yn~&N~UwP)MQv3--pmfraj*>eoaDe6zUzOaWL~P$1$V- znyL|CZYTOI-piV93-lU$iYpPMXV!}3E(JthUMp0~gwpM&Nor&UMQbpeG}n~AZsfYR zi+(SO*SqXqbAbP$sSvO2(0diipmOe*Q4DC#Q#178o4xa{`g^kSvpymuYYpaoA$2&FbMDL+HY1Py^+el6mxi)_@rX6E| zMwzV{k8X?eaT+53{KTVP1tks{>%O4pas1BAs;FU{YsCysbA+)3#+O4tks1eU4Uo{dr3D@1oH7 zG6O^iqab^Tt*}wCL%00m>C4tS59uS6(fUA(tyk6ScGEcpd1p0NxV<{*?(Oe}OV{68 z>-AGcH2p9Ei0*#LIOdju(v`o2X>L2F5S4KQQ7?}umk+UCC27cPaf~F!9K}T@E!D*1 z;hPbK_nI|s)>aQk9Eo*_MZ7Y7=Gm!R&cBS*E*<@?l#lXu^$7X7pUj>4?&tgMQ^GXF zt%%Ok)?O##1<3cPiVepC%n`+pr8@_(D%YA+K%!-EK z8ZR!gkQ0MM1T^-%Yd=rKqrScQm@Y^Yw1^LZge>bgp=ZhXm+rU>!o=TkwycN;7|SU& zpidSL?i9wSf>tN84$9=*zeA=|Gd2&TltEa%>q z8VF06f0Q>4jAQOSq`S`?F1!xCmeKCM`JNWZs)JflA`@*mv#+0~hphfH<;jzkTG8s) ziGyY*GU9qMmQrU9X7ZY##3h^HSU~%(HYr*q9KsGnZg=k4Nr(aHTW%<>I-DTzWw~R| z3;-IHiCRTwylBZ)8l$&kuL3|zva%#X+tL9Of-W`YvH=dB7&ks(E+-z=2m?@ju$8=Q zCpMHYX8L(N%y9)E1SzY5QMMPiJTZga5a8}mM^5Y-h!~UP$=(MAXvV0kP$Gy}A`&4> z1VKT6bo&KZF9#!#ssB&X^jSL@fRm1t8S&vqUnGx6U|3{;D2qaIf!a5?SGfNuf6<(e zZ>nz*g?|K4PcqR`TJ!&i>5;#-3Z}>qLE+X*0e1uA!bY08+H;}C`}#XngG;Q_+%iOi z;@3syrA>cmIt~0j_3sUroxlf&iNBjb?TvR3_lvh7zx6f}Ne;3Vrs1S0bL~0y2t#`)Q4P zyNES~eIIszV#7_){9H7@&{vy+_vez$^#BC4L}A}v9s;ZBpE&^X)qT6 z-n|uRs}j1myb(hT1A_>3rH>DV?)hOQ{}r16HXJKoV6C;ppl>7egbJx~IA@?mz93GM6OsjV6wjTduS7p(_y#G#$V^>#zO zP3Ee=7AL{Qp^=hqyE7csDl&lwDO~mKx~}ueEng`%xH@xD>L_D)mNbe7yUeqJOw?%6M77;*N+bnDzrz0p#J73Q4UwsI+0xKmpX@6OB z)#@p17CV*)6k>Cylj}5aUbDX~2C6|BUs-5nCesc5WoI3G;Od_Rvf>nNkw_dM@{@3Y zoD)9G%YU%hYgU_#14?R>DkR$k>(dK0aGk5-Mz{T{f{&PKIU(JC6UWvqPMiP|{d_E$ zzUoq+pnsm2j3;GIDzFutX=tg-eM6xdcO{VP0z-?pRRN%+ydM3cCp(8pK?eMi1dya2 zm2O2WtyJV{1z6$vc+GM7%bPIL+FjBK!YE23l>Jw)K@?|R^NG>jvc;1i ztCLec8mfrn9(TNAxn!(X{EM*!`p}5Oer!}F&qYC6*U88T<>d*WPi@y89W+7Qu`i0|FF5m@ zR`VjqDc6~iYa+*52joqsDc`Q)w7*X*|k$K=4!Fo({DEDFM9bV4Ea z4DVo*5ML^=q4m4H4AuutT*gMJ^vM7lKK5~lk~CO9G?A!mT*giK@)`SbQBOjDfViVS z25w|$Yk&NZ^QQ>Sp?lXx;}wbnu!t%GT~<~*D@@(?RT)vWnUy7zRzOg|ov68K(JD`PWgo&H?D4vv6Sj@oT3rzk5Ntz;V%V{dREG zM8<008JB=6cHjtQ`|rBfQM_v>-G6*0WLpA6Ftk2Rpzag*3q&OdSFLw*T?Y65il_sH zpYlBGYK)R_-Uq^kSu7GI0hS=hOaJ&F7f-IZ!V1~yHYUK29MgIlAj;AKkE-nLEOjUBX*DHI!!MzODdQyas0H`h>yp%brZ5TTldf($BknOncrN+H7 z@AoN{9~~Vs%OylB8~1bc(~*#9cU`6kc*p#@Jk-UhCYpO7J)Km0cEKjV_v&~aa4N9UoJuScrY7tNgW7L9An^s}1H>|0 zEwAF9D{R2WB$b%IIwB&-^w@&Q(vx%9fttXrw7&y#ez^+D<3K%mnMOsa7%W!526ykv z1wvyr?C1Naj)-V7owDklNCtZ7b3>QmZfV=M-EF-aX>OKaP*7zYmj|b<$ISmCt#lD7`$`bK)+j&*Mcj71zM>d@0H5%e% zR2E45n-6U$WYejH&7tM7v?J;_UNxu>f({KVB}L#I@$erGXc!{ka8J2|uDVP!5>wf` z{HS*O2_FwZot?SZf{po90}WLNmz0NK9c49e0Lo+JB^`$02MkcN%-&Ep*0cy>%-hM~ z1Cp%=%bpA|X5;dBQa-+eUIPV6>I!Dg?1M23M+iYkUw=C>j_eV8=Q)t}zCac~!4d>G z3hdSye%`iEJp$Payw_j#bPv$wkx=05`f)<-wj#ID(&} f4j?f882sq%`S>fc3#P0;K)|&t7N*t4=!gFYGjh|Q literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-hdpi/img_pomo_thumb.png b/core/designsystem/src/main/res/drawable-hdpi/img_pomo_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..bb860b73b01919fba24f6fe4482349e3be420427 GIT binary patch literal 1881 zcmV-f2d4OmP) zx>)_4Q%BgAFX(qwcUN_{JE$o{bYKpVvEqpQ?}LTEe;9kuZ%>R(JDtu1EvADSV8rX1 zLt+2ow~!j9#zw|&jJQ*@jM4=);zi~VBNOi^KWfF>#=wYrgMeRHL}PtpDV0xZtcQR* z+zuLhq?U=-UQ9XOz=Ai&_t%jPMSP^{R{qhMzh6aB4cCo<-9;c@#3N80^FLz6+AJY z&oP}&F_}#8@$vC_yMXU69%l{?4sdpMhSSqiL{S8fu&0jDHYiINI5C^eXgD0w)zuZn zaZLQOQZvHRU@#z$@Q^D)n;@l_#`8YK>vp@JLO>zlIx}8MX_}HJ($CkqV6i!Tn{MA&5E-?>^Z(Y5?j30ld$8x6*U(#B?Y}+uQV~?U)Tiu24%_i zloW7>1r>-1zrsFXpD_Q>kQ8ty2o;ODXdEfHXRV}u3{F(LnjBkB~nU-l*5y{i&>asG9pHkAm#9c+ovXoS(rmdDW#?iXUL&PYjUfN z5wo!IcuY!e(F91@397^JL}Q%ra1b>@ouMq$in+VHYm|ssA*wPDoS@F|2P7e7r}cJa z4$1u(b%Ye&*_0lwttmwvqmGbp9__w~i3L#=*`)f7O-azRZQAfeYRbez7j=QM$`f_9sGxa*9si6WDfUrcSDjs(`@FpTkXVGBX0womAG>oW(cu9)(obiB@DdbzM-L4${GheIxh zULhCoKnS@zf^*)&y!RPAAokG1!$Sn@5DsH_wO<5B#L4-9J?x>vwlsz#VnKQDy?{M0 zFE5hQo!e2dpdptlLs&0$&hLr~+=_y3t9gEY7Cr+*m$p<~4-FnFgRhscx69Eo(Iy%S zK||MdhrGVNLP%t62nC_qQUaVgQbaaxPsKT2v7jNbAcw_Nl-8KOH1rmNT8~9SwM7Se zsba>YxDq4I6dfH|ub2odp(w2}zaWJKE6;c`6dG1^u9GR3`OEUWl6iXjx#Iu^8X!LM)Q{SbvD5DF>^yKP#MzbjKrDBGH%{Then zKjJomCH!kf0XGz5)84idmJI4I3bX!dhGHJ? z>EaD%LBnb^{|Liwcd>J{QcyE=nZlBvKYt?N7e(jjtCqRRL#{!<@jcc#7>zOo%>4HYs?~u;#v^(Tx^fBU*7^>oH|DNow`c=y3V> zh7))!Y9(lXoWq}2ulgcHOOG*!YaUxXr?GI@?f0z7B#}%c zc-$0ndHBM=5j8S@4v>Z4;=}NLEanL9V!Cv6AzC`FY+l~p-i~5>MdJPoIl2MM2E+5!R1L^xJ!C8JgF3$NMw+rm# T^d6RM00000NkvXXu0mjf&~R|g literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-mdpi/img_pomo_hand.png b/core/designsystem/src/main/res/drawable-mdpi/img_pomo_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6f21ae0e1bb4b5085f3c16a4133ba8c3689c35 GIT binary patch literal 3040 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 M07*qoM6N<$f^Sf9btc~Jnso(t#yumu1% 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 x8n9sbT~@Y;n4 ze&^H~dF=9-kLs>R_q0$`i0H^2j^;NPe`jl+{yw*tR;%?6L!A~9#)&C&hYkt>9Xo4d zv!Hf?g*I{ayozi%`E%nb4?+DxXnrk(J3| zg8QIKp^e<(8qFhzr9|)#Du9Y~KodpAWX`74@RUe!kLJGMOLusH!AzW8HL-9XRA}?b zKhMh!Sw31xp69b;mSw1z+}UZ<#1>3wRY#aCoXKQ@*Vk9PzrW9H`Ej;YkG0!v+}zyY z?Ch*6;k}@kw^>V)1dcGN$eah``T3a!g8^M$UeeLg5%J4P&54XgqY+ia5Dg-TM{{2y z|6)&|0DGU8mlyo`^JjKsuf)e?ucS$*)4^~!tirqXomabsu|HIlWW-FTQ|flRYTgR* zdbb{o{opT+6kw6@iN*m0wrnhRem{Y^hOrx@Br=9iE+P;aO5Tml1K?R zH;PJRW#eHypoimjDQi1g2Nf+pQ&J$NA#JdhGR(MDq8S~i})1rS?wrMpTY#R&7^;UOtO zp<1!=f7VQ~k)p_4hW}s**-*yA=-Zp>dYd7dhWpT$q(mJ>wlG)1B4v7L3RFaxDnHef z(ipzR(Wo*V)E!dn#%O}b7RHgZB2%jSe9e8pU!+94-A+m@Qd1UNA9cljIJGe# z6vbB0$^j{6{_Bt{lbB-5(GYcmlu{WSVInbMgfK<1bx;?m@MdC~H2L4f#^W(5Fh*S< zg#dsPmnO2$rdU0=L>(aE+>Axmv%#8+W-V6W{80@`Q6iNbH2hY5`VK zjS&GKLnjGZPk8S#LkAv0&(F_4wmwy$LlLwUmFH;QF81;95r!Ttw$szo*@lBk3=s=d zTw%@&o1cX<#W~vzVt_m^0%rNM@TQbw

j|44!|Pn%;1S)WMpiCMRt2D-YuTf9fw(OK!QDJt!2A< zOL4t{*rVCdSv@?23dx*RpY9;Rwg*Ve8`Q;=TEH_@L?zejH1tuJt1&}Vgb6KC_)32F z_xBJ|Z5`Bx&NPine+n(&Q>q{^Sa>w=?}Qb%*zA z3h9pEbx^TKJHVx)jS}qD6w)0mvMvHL6I!d)%HfF#?eK75z$WAZ0VzkFIXtjAS{x|U zK{*1=5D2l*%%jBtS7;OhgDwJ57TPO3`1b7^j5rt!2GWw?83G|r*qTR+2ZipAcBtsH zEHrVWlW}-Pqmg8;#v%){4%A9eHAFa93obMZA8Udz)e$7kQ5M=Uj9S25&w}AINTFTq z(QK7^e6YxbE%v{(gMzZqGI*e{Si%Uv@87>6fahsFD6&`u#p?A^u(fi>i9$(=w+vSk z+rp!HM;hkQ;)I2!aBg_jvdW67h0wgmV-s4uD3qj_p+*fr@}=uWNQm}1SA1Ae5PXx8^jDCfjl=%X58?Z)R*04Q@EPm-V2VG^Jv}|bUHgb zgOLUbE2dav{@W;!VEE);2on2cH`x@T(7n9cCy&-@wYV@gfd^b6u$)>tD3qu6+D2hj z3CcUo(dl$xq=Rt96ti=>VU^G(@Wh0c77AWXw!UCK{@OgPA#*ih1UkkJtn1$JDze)= zEj`$)3AZTi>=G2L6PowZCL2D}gIkG&Y)y5n6WRoxn9$OL^J>DyEI-I+c^+9lt#RfY z1PSr$z$HOB%J#KQ(}Xq9F*dNNmD}=Z4ddy_y8_81z?^=dYBrj0^S@MZW6A~Yj?q(Q-QPA%B3 z+_oo2+9(7C*X0`~G-EBoO2K70DA*`8yXsxDQMfopcX1<_M>Cw;Yptjv7(VROcvKtsNuu7mJ(MpETorSi5iftt?QC#Sq-|Rbz2FbyEHzK2c%!E0e zPP;BY>J@(OEi|LK%ttk^@zbuUZtRR?|2)Ik3r=^D2QZ9%q5XF;=)*Afg^Imdo=s#% zC9sHS{iU78RBGq8sM8QL7gT$Ga~3cxH_iSJ^cR(gk8f$100000NkvXXu0mjf6$_K1 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xxhdpi/img_pomo_hand.png b/core/designsystem/src/main/res/drawable-xxhdpi/img_pomo_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2d6c0fc0ecfcf7ead442329feabc28659d1671 GIT binary patch literal 10215 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 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable/ic_double_down_arrow_24.xml b/core/designsystem/src/main/res/drawable/ic_double_down_arrow_24.xml new file mode 100644 index 00000000..03621063 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_double_down_arrow_24.xml @@ -0,0 +1,20 @@ + + + + From 626487e2546b22048bc0e1ca6a7245f7f58a9382 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Thu, 4 Sep 2025 21:29:14 +0900 Subject: [PATCH 02/12] =?UTF-8?q?CHORE:=20=EA=B8=B0=EC=A1=B4=20=EA=B0=90?= =?UTF-8?q?=EC=A0=95=EA=B5=AC=EC=8A=AC=20=EC=84=A0=ED=83=9D,=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EB=A3=A8=ED=8B=B4=20=ED=99=94=EB=A9=B4=EB=A5=BC=20?= =?UTF-8?q?emotion/component/template=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/emotion/EmotionScreen.kt | 246 +----------------- .../template/EmotionRecommendRoutineScreen.kt | 134 ++++++++++ .../template/SimpleEmotionSelectionScreen.kt | 129 +++++++++ 3 files changed, 266 insertions(+), 243 deletions(-) create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt index f1f4bd68..f44722f8 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt @@ -1,50 +1,15 @@ package com.threegap.bitnagil.presentation.emotion import androidx.activity.compose.BackHandler -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -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.statusBarsPadding -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.grid.items -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextDecoration -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import coil3.compose.AsyncImage -import coil3.request.ImageRequest -import coil3.request.crossfade -import com.threegap.bitnagil.designsystem.BitnagilTheme -import com.threegap.bitnagil.designsystem.component.atom.BitnagilSelectButton -import com.threegap.bitnagil.designsystem.component.atom.BitnagilTextButton -import com.threegap.bitnagil.designsystem.component.atom.BitnagilTextButtonColor -import com.threegap.bitnagil.designsystem.component.block.BitnagilTopBar -import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple import com.threegap.bitnagil.presentation.common.flow.collectAsEffect -import com.threegap.bitnagil.presentation.emotion.model.EmotionRecommendRoutineUiModel +import com.threegap.bitnagil.presentation.emotion.component.template.EmotionRecommendRoutineScreen +import com.threegap.bitnagil.presentation.emotion.component.template.SimpleEmotionSelectionScreen import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep -import com.threegap.bitnagil.presentation.emotion.model.EmotionUiModel import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionSideEffect -import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState @Composable fun EmotionScreenContainer( @@ -64,7 +29,7 @@ fun EmotionScreenContainer( } when (state.step) { - EmotionScreenStep.Emotion -> EmotionScreen( + EmotionScreenStep.Emotion -> SimpleEmotionSelectionScreen( state = state, onClickPreviousButton = navigateToBack, onClickEmotion = viewModel::selectEmotion, @@ -77,208 +42,3 @@ fun EmotionScreenContainer( ) } } - -@Composable -private fun EmotionScreen( - state: EmotionState, - onClickPreviousButton: () -> Unit, - onClickEmotion: (String) -> Unit, -) { - Column( - modifier = Modifier - .fillMaxSize() - .background(color = BitnagilTheme.colors.white) - .statusBarsPadding(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - BitnagilTopBar( - showBackButton = true, - onBackClick = onClickPreviousButton, - ) - - Spacer(modifier = Modifier.height(32.dp)) - - Text( - "오늘의 감정구슬을 골라보세요", - style = BitnagilTheme.typography.title2Bold.copy(color = BitnagilTheme.colors.navy500), - textAlign = TextAlign.Center, - ) - - Spacer(modifier = Modifier.height(6.dp)) - - Text( - "감정구슬을 등록하면 루틴을 추천받아요!", - style = BitnagilTheme.typography.subtitle1Regular.copy(color = BitnagilTheme.colors.navy300), - textAlign = TextAlign.Center, - ) - - Spacer(modifier = Modifier.height(64.dp)) - - LazyVerticalGrid( - columns = GridCells.Fixed(3), - modifier = Modifier.padding(horizontal = 24.dp), - horizontalArrangement = Arrangement.spacedBy(12.dp), - verticalArrangement = Arrangement.spacedBy(28.dp), - ) { - items(state.emotionTypeUiModels) { emotion -> - Column( - modifier = Modifier - .clickableWithoutRipple { onClickEmotion(emotion.emotionType) }, - horizontalAlignment = Alignment.CenterHorizontally, - ) { - AsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data(emotion.imageUrl) - .crossfade(true) - .build(), - modifier = Modifier.aspectRatio(1f), - contentDescription = null, - error = emotion.offlineBackupImageResourceId?.let { painterResource(it) }, - ) - - Text( - text = emotion.emotionMarbleName, - style = BitnagilTheme.typography.body1Regular.copy(color = BitnagilTheme.colors.coolGray20), - ) - } - } - } - } -} - -@Composable -private fun EmotionRecommendRoutineScreen( - state: EmotionState, - onClickRoutine: (String) -> Unit, - onClickRegisterRecommendRoutines: () -> Unit, - onClickSkip: () -> Unit, -) { - Column( - modifier = Modifier - .fillMaxSize() - .background(color = BitnagilTheme.colors.coolGray99) - .statusBarsPadding() - .padding(start = 16.dp, end = 16.dp, bottom = 20.dp, top = 32.dp), - ) { - Spacer(modifier = Modifier.height(54.dp)) - - Text( - text = "오늘 감정에 따른\n루틴을 추천드릴께요!", - color = BitnagilTheme.colors.navy500, - style = BitnagilTheme.typography.title2Bold, - ) - - Spacer(modifier = Modifier.height(10.dp)) - - Text( - text = "오늘 당신의 감정 상태에 맞춰 구성된 맞춤 루틴이에요.\n원하는 루틴을 선택해서 가볍게 시작해보세요.", - color = BitnagilTheme.colors.coolGray50, - style = BitnagilTheme.typography.body2Medium, - ) - - Spacer(modifier = Modifier.height(28.dp)) - - val scrollState = rememberScrollState() - Column( - modifier = Modifier - .weight(1f) - .verticalScroll(state = scrollState), - ) { - for (recommendRoutine in state.recommendRoutines) { - BitnagilSelectButton( - title = recommendRoutine.name, - description = recommendRoutine.description, - onClick = { onClickRoutine(recommendRoutine.id) }, - selected = recommendRoutine.selected, - modifier = Modifier.padding(bottom = 12.dp), - ) - } - } - - Spacer(modifier = Modifier.height(12.dp)) - - BitnagilTextButton( - text = "변경하기", - onClick = onClickRegisterRecommendRoutines, - enabled = state.registerRecommendRoutinesButtonEnabled, - modifier = Modifier.fillMaxWidth(), - ) - - Spacer(modifier = Modifier.height(10.dp)) - - BitnagilTextButton( - text = "건너뛰기", - onClick = onClickSkip, - colors = BitnagilTextButtonColor.skip().copy( - defaultBackgroundColor = Color.Transparent, - pressedBackgroundColor = Color.Transparent, - disabledBackgroundColor = Color.Transparent, - ), - textStyle = BitnagilTheme.typography.body2Regular, - textDecoration = TextDecoration.Underline, - modifier = Modifier.fillMaxWidth(), - ) - } -} - -@Preview -@Composable -private fun EmotionScreenPreview() { - BitnagilTheme { - EmotionScreen( - state = EmotionState( - emotionTypeUiModels = listOf( - EmotionUiModel( - emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", - emotionMarbleName = "emotionMarbleName", - offlineBackupImageResourceId = null, - ), - EmotionUiModel( - emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", - emotionMarbleName = "emotionMarbleName", - offlineBackupImageResourceId = null, - ), - ), - isLoading = false, - step = EmotionScreenStep.Emotion, - recommendRoutines = listOf(), - ), - onClickEmotion = { _ -> }, - onClickPreviousButton = {}, - ) - } -} - -@Preview -@Composable -private fun EmotionRecommendRoutineScreenPreview() { - BitnagilTheme { - EmotionRecommendRoutineScreen( - state = EmotionState( - emotionTypeUiModels = listOf( - EmotionUiModel( - emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", - emotionMarbleName = "emotionMarbleName", - offlineBackupImageResourceId = null, - ), - ), - isLoading = false, - step = EmotionScreenStep.RecommendRoutines, - recommendRoutines = listOf( - EmotionRecommendRoutineUiModel( - id = "1", - name = "루틴 이름", - description = "루틴 설명", - selected = true, - ), - ), - ), - onClickRoutine = {}, - onClickRegisterRecommendRoutines = {}, - onClickSkip = {}, - ) - } -} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt new file mode 100644 index 00000000..0858b144 --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt @@ -0,0 +1,134 @@ +package com.threegap.bitnagil.presentation.emotion.component.template + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +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.statusBarsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.threegap.bitnagil.designsystem.BitnagilTheme +import com.threegap.bitnagil.designsystem.component.atom.BitnagilSelectButton +import com.threegap.bitnagil.designsystem.component.atom.BitnagilTextButton +import com.threegap.bitnagil.designsystem.component.atom.BitnagilTextButtonColor +import com.threegap.bitnagil.presentation.emotion.model.EmotionRecommendRoutineUiModel +import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep +import com.threegap.bitnagil.presentation.emotion.model.EmotionUiModel +import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState + +@Composable +fun EmotionRecommendRoutineScreen( + state: EmotionState, + onClickRoutine: (String) -> Unit, + onClickRegisterRecommendRoutines: () -> Unit, + onClickSkip: () -> Unit, +) { + Column( + modifier = Modifier + .fillMaxSize() + .background(color = BitnagilTheme.colors.coolGray99) + .statusBarsPadding() + .padding(start = 16.dp, end = 16.dp, bottom = 20.dp, top = 32.dp), + ) { + Spacer(modifier = Modifier.height(54.dp)) + + Text( + text = "오늘 감정에 따른\n루틴을 추천드릴께요!", + color = BitnagilTheme.colors.navy500, + style = BitnagilTheme.typography.title2Bold, + ) + + Spacer(modifier = Modifier.height(10.dp)) + + Text( + text = "오늘 당신의 감정 상태에 맞춰 구성된 맞춤 루틴이에요.\n원하는 루틴을 선택해서 가볍게 시작해보세요.", + color = BitnagilTheme.colors.coolGray50, + style = BitnagilTheme.typography.body2Medium, + ) + + Spacer(modifier = Modifier.height(28.dp)) + + val scrollState = rememberScrollState() + Column( + modifier = Modifier + .weight(1f) + .verticalScroll(state = scrollState), + ) { + for (recommendRoutine in state.recommendRoutines) { + BitnagilSelectButton( + title = recommendRoutine.name, + description = recommendRoutine.description, + onClick = { onClickRoutine(recommendRoutine.id) }, + selected = recommendRoutine.selected, + modifier = Modifier.padding(bottom = 12.dp), + ) + } + } + + Spacer(modifier = Modifier.height(12.dp)) + + BitnagilTextButton( + text = "변경하기", + onClick = onClickRegisterRecommendRoutines, + enabled = state.registerRecommendRoutinesButtonEnabled, + modifier = Modifier.fillMaxWidth(), + ) + + Spacer(modifier = Modifier.height(10.dp)) + + BitnagilTextButton( + text = "건너뛰기", + onClick = onClickSkip, + colors = BitnagilTextButtonColor.skip().copy( + defaultBackgroundColor = Color.Transparent, + pressedBackgroundColor = Color.Transparent, + disabledBackgroundColor = Color.Transparent, + ), + textStyle = BitnagilTheme.typography.body2Regular, + textDecoration = TextDecoration.Underline, + modifier = Modifier.fillMaxWidth(), + ) + } +} + +@Preview +@Composable +private fun Preview() { + BitnagilTheme { + EmotionRecommendRoutineScreen( + state = EmotionState( + emotionTypeUiModels = listOf( + EmotionUiModel( + emotionType = "emotionType", + imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + emotionMarbleName = "emotionMarbleName", + offlineBackupImageResourceId = null, + ), + ), + isLoading = false, + step = EmotionScreenStep.RecommendRoutines, + recommendRoutines = listOf( + EmotionRecommendRoutineUiModel( + id = "1", + name = "루틴 이름", + description = "루틴 설명", + selected = true, + ), + ), + ), + onClickRoutine = {}, + onClickRegisterRecommendRoutines = {}, + onClickSkip = {}, + ) + } +} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt new file mode 100644 index 00000000..61e44acf --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt @@ -0,0 +1,129 @@ +package com.threegap.bitnagil.presentation.emotion.component.template + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import coil3.compose.AsyncImage +import coil3.request.ImageRequest +import coil3.request.crossfade +import com.threegap.bitnagil.designsystem.BitnagilTheme +import com.threegap.bitnagil.designsystem.component.block.BitnagilTopBar +import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple +import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep +import com.threegap.bitnagil.presentation.emotion.model.EmotionUiModel +import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState + +@Composable +fun SimpleEmotionSelectionScreen( + state: EmotionState, + onClickPreviousButton: () -> Unit, + onClickEmotion: (String) -> Unit, +) { + Column( + modifier = Modifier + .fillMaxSize() + .background(color = BitnagilTheme.colors.white) + .statusBarsPadding(), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + BitnagilTopBar( + showBackButton = true, + title = "오늘 감정 등록하기", + onBackClick = onClickPreviousButton, + ) + + Box( + modifier = Modifier.fillMaxHeight(), + contentAlignment = Alignment.Center + ) { + LazyVerticalGrid( + columns = GridCells.Fixed(3), + modifier = Modifier.padding(horizontal = 24.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalArrangement = Arrangement.spacedBy(28.dp), + ) { + items(state.emotionTypeUiModels) { emotion -> + Column( + modifier = Modifier + .clickableWithoutRipple { onClickEmotion(emotion.emotionType) }, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data(emotion.imageUrl) + .crossfade(true) + .build(), + modifier = Modifier.aspectRatio(1f), + contentDescription = null, + error = emotion.offlineBackupImageResourceId?.let { painterResource(it) }, + ) + + Text( + text = emotion.emotionMarbleName, + style = BitnagilTheme.typography.body1Regular.copy(color = BitnagilTheme.colors.coolGray20), + ) + } + } + } + } + } +} + +@Preview(heightDp = 360, widthDp = 360) +@Composable +private fun Preview() { + BitnagilTheme { + SimpleEmotionSelectionScreen( + state = EmotionState( + emotionTypeUiModels = listOf( + EmotionUiModel( + emotionType = "emotionType", + imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + emotionMarbleName = "name1", + offlineBackupImageResourceId = null, + ), + EmotionUiModel( + emotionType = "emotionType", + imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + emotionMarbleName = "name2", + offlineBackupImageResourceId = null, + ), + EmotionUiModel( + emotionType = "emotionType", + imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + emotionMarbleName = "name3", + offlineBackupImageResourceId = null, + ), + EmotionUiModel( + emotionType = "emotionType", + imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + emotionMarbleName = "name4", + offlineBackupImageResourceId = null, + ), + ), + isLoading = false, + step = EmotionScreenStep.Emotion, + recommendRoutines = listOf(), + ), + onClickEmotion = { _ -> }, + onClickPreviousButton = {}, + ) + } +} From 3ed3404ce6c768b5523ca57d5f05ba1912011578 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Sat, 6 Sep 2025 23:28:48 +0900 Subject: [PATCH 03/12] =?UTF-8?q?FIX:=20=EA=B0=90=EC=A0=95=EA=B5=AC?= =?UTF-8?q?=EC=8A=AC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B0=8F=20=EA=B0=90?= =?UTF-8?q?=EC=A0=95=EA=B5=AC=EC=8A=AC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20Ui?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/atom/EmotionMarbleImage.kt | 39 ++++++++++++++++++ .../template/EmotionRecommendRoutineScreen.kt | 7 +++- .../template/SimpleEmotionSelectionScreen.kt | 40 +++++++++---------- .../emotion/model/EmotionImageUiModel.kt | 10 +++++ .../emotion/model/EmotionUiModel.kt | 17 ++++++-- 5 files changed, 87 insertions(+), 26 deletions(-) create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt new file mode 100644 index 00000000..8fcd1a75 --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt @@ -0,0 +1,39 @@ +package com.threegap.bitnagil.presentation.emotion.component.atom + +import androidx.compose.foundation.Image +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import coil3.compose.AsyncImage +import coil3.request.ImageRequest +import coil3.request.crossfade +import com.threegap.bitnagil.presentation.emotion.model.EmotionImageUiModel + +@Composable +fun EmotionMarbleImage( + modifier: Modifier, + image: EmotionImageUiModel, + contentDescription: String? = null, +) { + when (image) { + is EmotionImageUiModel.Url -> { + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data(image.url) + .crossfade(true) + .build(), + modifier = modifier, + contentDescription = null, + error = image.offlineBackupImageResourceId?.let { painterResource(it) }, + ) + } + is EmotionImageUiModel.Resource -> { + Image( + painter = painterResource(id = image.resourceId), + contentDescription = contentDescription, + modifier = modifier, + ) + } + } +} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt index 0858b144..bda98f1f 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt @@ -21,6 +21,7 @@ import com.threegap.bitnagil.designsystem.BitnagilTheme import com.threegap.bitnagil.designsystem.component.atom.BitnagilSelectButton import com.threegap.bitnagil.designsystem.component.atom.BitnagilTextButton import com.threegap.bitnagil.designsystem.component.atom.BitnagilTextButtonColor +import com.threegap.bitnagil.presentation.emotion.model.EmotionImageUiModel import com.threegap.bitnagil.presentation.emotion.model.EmotionRecommendRoutineUiModel import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep import com.threegap.bitnagil.presentation.emotion.model.EmotionUiModel @@ -110,9 +111,11 @@ private fun Preview() { emotionTypeUiModels = listOf( EmotionUiModel( emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", emotionMarbleName = "emotionMarbleName", - offlineBackupImageResourceId = null, + image = EmotionImageUiModel.Url( + url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + offlineBackupImageResourceId = null, + ), ), ), isLoading = false, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt index 61e44acf..b77628ea 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt @@ -16,16 +16,13 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import coil3.compose.AsyncImage -import coil3.request.ImageRequest -import coil3.request.crossfade import com.threegap.bitnagil.designsystem.BitnagilTheme import com.threegap.bitnagil.designsystem.component.block.BitnagilTopBar import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple +import com.threegap.bitnagil.presentation.emotion.component.atom.EmotionMarbleImage +import com.threegap.bitnagil.presentation.emotion.model.EmotionImageUiModel import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep import com.threegap.bitnagil.presentation.emotion.model.EmotionUiModel import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState @@ -65,14 +62,9 @@ fun SimpleEmotionSelectionScreen( .clickableWithoutRipple { onClickEmotion(emotion.emotionType) }, horizontalAlignment = Alignment.CenterHorizontally, ) { - AsyncImage( - model = ImageRequest.Builder(LocalContext.current) - .data(emotion.imageUrl) - .crossfade(true) - .build(), + EmotionMarbleImage( modifier = Modifier.aspectRatio(1f), - contentDescription = null, - error = emotion.offlineBackupImageResourceId?.let { painterResource(it) }, + image = emotion.image, ) Text( @@ -95,27 +87,35 @@ private fun Preview() { emotionTypeUiModels = listOf( EmotionUiModel( emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", emotionMarbleName = "name1", - offlineBackupImageResourceId = null, + image = EmotionImageUiModel.Url( + url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + offlineBackupImageResourceId = null, + ), ), EmotionUiModel( emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", emotionMarbleName = "name2", - offlineBackupImageResourceId = null, + image = EmotionImageUiModel.Url( + url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + offlineBackupImageResourceId = null, + ), ), EmotionUiModel( emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", emotionMarbleName = "name3", - offlineBackupImageResourceId = null, + image = EmotionImageUiModel.Url( + url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + offlineBackupImageResourceId = null, + ), ), EmotionUiModel( emotionType = "emotionType", - imageUrl = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", emotionMarbleName = "name4", - offlineBackupImageResourceId = null, + image = EmotionImageUiModel.Url( + url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + offlineBackupImageResourceId = null, + ), ), ), isLoading = false, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt new file mode 100644 index 00000000..e387b3af --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt @@ -0,0 +1,10 @@ +package com.threegap.bitnagil.presentation.emotion.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +sealed class EmotionImageUiModel : Parcelable { + class Url(val url: String, val offlineBackupImageResourceId: Int?) : EmotionImageUiModel() + class Resource(val resourceId: Int) : EmotionImageUiModel() +} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt index 4f575688..871b9484 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt @@ -9,15 +9,17 @@ import kotlinx.parcelize.Parcelize data class EmotionUiModel( val emotionType: String, val emotionMarbleName: String, - val imageUrl: String, - val offlineBackupImageResourceId: Int?, + val image: EmotionImageUiModel, + val selectable: Boolean = true, ) : Parcelable { companion object { fun fromDomain(emotion: Emotion) = EmotionUiModel( emotionType = emotion.emotionType, emotionMarbleName = emotion.emotionMarbleName, - imageUrl = emotion.imageUrl, - offlineBackupImageResourceId = getOfflineBackupImageResourceId(emotion.emotionType), + image = EmotionImageUiModel.Url( + url = emotion.imageUrl, + offlineBackupImageResourceId = getOfflineBackupImageResourceId(emotion.emotionType) + ), ) private fun getOfflineBackupImageResourceId(emotionType: String): Int? { @@ -31,5 +33,12 @@ data class EmotionUiModel( else -> null } } + + val Default = EmotionUiModel( + emotionType = "NONE", + emotionMarbleName = "구슬 선택", + image = EmotionImageUiModel.Resource(R.drawable.default_marble), + selectable = false, + ) } } From ef69c1dee39568c91bc22c888bd034c070b43c3e Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Sat, 6 Sep 2025 23:32:04 +0900 Subject: [PATCH 04/12] =?UTF-8?q?FEAT:=20=EA=B0=90=EC=A0=95=EA=B5=AC?= =?UTF-8?q?=EC=8A=AC=20=EB=A6=AC=EB=94=94=EC=9E=90=EC=9D=B8=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bitnagil/designsystem/typography/Type.kt | 8 + .../res/drawable/ic_double_left_arrow_24.xml | 20 + .../res/drawable/ic_double_right_arrow_24.xml | 20 + .../presentation/common/dimension/dpToPx.kt | 9 + .../template/SwipeEmotionSelectionScreen.kt | 402 ++++++++++++++++++ 5 files changed, 459 insertions(+) create mode 100644 core/designsystem/src/main/res/drawable/ic_double_left_arrow_24.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_double_right_arrow_24.xml create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/dpToPx.kt create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt diff --git a/core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/typography/Type.kt b/core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/typography/Type.kt index fb304e13..b6fae062 100644 --- a/core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/typography/Type.kt +++ b/core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/typography/Type.kt @@ -101,6 +101,13 @@ class BitnagilTypography internal constructor( lineHeight = 30, letterSpacing = (-0.5f), ), + private val _cafe24SsurroundAir2: BitnagilTextStyle = BitnagilTextStyle( + fontFamily = cafe24SsurroundAir, + fontWeight = FontWeight.Light, + fontSize = 16, + lineHeight = 24, + letterSpacing = (-0.5f), + ), ) { private val _headline1Bold = _headline1.copy(fontWeight = FontWeight.Bold) private val _headline1Medium = _headline1.copy(fontWeight = FontWeight.Medium) @@ -163,6 +170,7 @@ class BitnagilTypography internal constructor( val button1: TextStyle @Composable get() = _button1.toDpTextStyle val button2: TextStyle @Composable get() = _button2.toDpTextStyle val cafe24SsurroundAir: TextStyle @Composable get() = _cafe24SsurroundAir.toDpTextStyle + val cafe24SsurroundAir2: TextStyle @Composable get() = _cafe24SsurroundAir2.toDpTextStyle } internal val LocalBitnagilTypography = staticCompositionLocalOf { BitnagilTypography() } diff --git a/core/designsystem/src/main/res/drawable/ic_double_left_arrow_24.xml b/core/designsystem/src/main/res/drawable/ic_double_left_arrow_24.xml new file mode 100644 index 00000000..e52330f7 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_double_left_arrow_24.xml @@ -0,0 +1,20 @@ + + + + diff --git a/core/designsystem/src/main/res/drawable/ic_double_right_arrow_24.xml b/core/designsystem/src/main/res/drawable/ic_double_right_arrow_24.xml new file mode 100644 index 00000000..23398e2f --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_double_right_arrow_24.xml @@ -0,0 +1,20 @@ + + + + diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/dpToPx.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/dpToPx.kt new file mode 100644 index 00000000..e6893980 --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/dpToPx.kt @@ -0,0 +1,9 @@ +package com.threegap.bitnagil.presentation.common.dimension + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp + + +@Composable +fun Dp.dpToPx() = with(LocalDensity.current) { this@dpToPx.toPx() } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt new file mode 100644 index 00000000..a75ed55a --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt @@ -0,0 +1,402 @@ +package com.threegap.bitnagil.presentation.emotion.component.template + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.draggable +import androidx.compose.foundation.gestures.rememberDraggableState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +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.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.lerp +import androidx.compose.ui.zIndex +import com.threegap.bitnagil.designsystem.BitnagilTheme +import com.threegap.bitnagil.designsystem.R +import com.threegap.bitnagil.designsystem.component.block.BitnagilTopBar +import com.threegap.bitnagil.presentation.common.dimension.dpToPx +import com.threegap.bitnagil.presentation.emotion.component.atom.EmotionMarbleImage +import com.threegap.bitnagil.presentation.emotion.model.EmotionImageUiModel +import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep +import com.threegap.bitnagil.presentation.emotion.model.EmotionUiModel +import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlin.math.absoluteValue +import kotlin.math.max + +@Composable +fun SwipeEmotionSelectionScreen( + state: EmotionState, + onClickPreviousButton: () -> Unit, + onSelectEmotion: (String) -> Unit, +) { + Column( + modifier = Modifier + .fillMaxSize() + .background(color = BitnagilTheme.colors.white) + .statusBarsPadding(), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + BitnagilTopBar( + showBackButton = true, + title = "오늘 감정 등록하기", + onBackClick = onClickPreviousButton, + ) + + Spacer(modifier = Modifier.height(20.dp)) + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + state.emotionTypeUiModels.forEach { emotion -> + EmotionMarbleImage( + modifier = Modifier + .size(40.dp) + .background(color = BitnagilTheme.colors.coolGray98), + image = emotion.image, + ) + } + } + + Spacer(modifier = Modifier.height(26.dp)) + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Box( + modifier = Modifier + .background(Color(0xFFEFECFF), shape = RoundedCornerShape(12.dp)) + .padding(20.dp), + contentAlignment = Alignment.Center, + ) { + Text( + "평온함은 마음이 고요하고 편안해\n균형을 이루는 상태에요", + style = BitnagilTheme.typography.cafe24SsurroundAir2.copy(color = Color(0xFF692BD0)), + textAlign = TextAlign.Center, + ) + } + + Canvas( + modifier = Modifier + .height(10.dp) + .width(24.dp), + ) { + val path = Path().apply { + moveTo(0f, 0f) + lineTo(size.width, 0f) + lineTo(size.width / 2 , size.height) + lineTo(0f, 0f) + close() + } + drawPath(path, color = Color(0xFFEFECFF)) + } + } + + Spacer(modifier = Modifier.height(16.dp)) + + Box( + modifier = Modifier.weight(1f), + ) { + EmotionPager( + modifier = Modifier + .fillMaxSize() + .zIndex(1f), + emotions = state.emotionTypeUiModels, + enabled = !state.isLoading, + onSelectEmotion = onSelectEmotion, + ) + + Column( + modifier = Modifier.align(Alignment.BottomCenter), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + GestureDescriptionText( + currentEmotionSelectable = state.emotionTypeUiModels.any { it.selectable }, + ) + + Spacer(modifier = Modifier.height(12.dp)) + + Image( + painter = painterResource(R.drawable.img_pomo_hand), + contentScale = ContentScale.FillBounds, + contentDescription = null, + modifier = Modifier + .width(263.dp) + .height(192.dp), + ) + } + + Image( + painter = painterResource(R.drawable.img_pomo_thumb), + modifier = Modifier + .align(Alignment.BottomCenter) + .zIndex(3f) + .offset(x = (-20).dp, y = (-70).dp), + contentDescription = null, + ) + } + } +} + +@Composable +private fun GestureDescriptionText( + currentEmotionSelectable: Boolean, +) { + if (currentEmotionSelectable) { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text("선택한 감정 구슬을 아래로 놓아주세요", style = BitnagilTheme.typography.body2Medium.copy(color = BitnagilTheme.colors.coolGray50)) + + Spacer(modifier = Modifier.height(12.dp)) + + Image( + painter = painterResource(R.drawable.ic_double_down_arrow_24), + modifier = Modifier.size(24.dp), + contentDescription = null, + ) + } + } else { + Row( + horizontalArrangement = Arrangement.spacedBy(26.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painter = painterResource(R.drawable.ic_double_left_arrow_24), + modifier = Modifier.size(24.dp), + contentDescription = null, + ) + + Text( + "좌우로 스와이프해\n감정 구슬을 골라주세요", + style = BitnagilTheme.typography.body2Medium.copy(color = BitnagilTheme.colors.coolGray50), + textAlign = TextAlign.Center, + ) + + Image( + painter = painterResource(R.drawable.ic_double_right_arrow_24), + modifier = Modifier.size(24.dp), + contentDescription = null, + ) + } + } +} + +@Composable +private fun EmotionPager( + modifier: Modifier = Modifier, + emotions: List, + enabled: Boolean, + onSelectEmotion: (String) -> Unit, +) { + val actualItemCount = max(1, emotions.size) + + val pagerState = rememberPagerState( + initialPage = Int.MAX_VALUE / 2 - (Int.MAX_VALUE / 2 % actualItemCount), + pageCount = { Int.MAX_VALUE }, + ) + + var showText by remember { mutableStateOf(true) } + val currentItem = emotions[pagerState.currentPage % actualItemCount] + + LaunchedEffect(pagerState.isScrollInProgress) { + if (pagerState.isScrollInProgress) { + showText = false + } else { + delay(500) + showText = true + } + } + + BoxWithConstraints( + modifier = modifier, + contentAlignment = Alignment.TopCenter, + ) { + val density = LocalDensity.current + val screenWidth = with(density) { constraints.maxWidth.toDp() } + + val itemWidth = 140.dp + val contentPadding = (screenWidth - itemWidth) / 2 + val pageSpacing = ((screenWidth - itemWidth * 2) / 2) + + HorizontalPager( + modifier = Modifier.fillMaxHeight(), + state = pagerState, + pageSpacing = pageSpacing, + contentPadding = PaddingValues(horizontal = contentPadding), + verticalAlignment = Alignment.Top, + ) { page -> + val itemIndex = page % actualItemCount + EmotionPagerItem( + emotion = emotions[itemIndex], + pagerState = pagerState, + page = page, + size = itemWidth, + maximumDraggableYOffset = constraints.maxHeight - 280.dp.dpToPx(), + enabled = enabled, + onSelectEmotion = onSelectEmotion, + ) + } + + AnimatedVisibility( + visible = showText, + enter = fadeIn(animationSpec = tween(150)), + exit = fadeOut(animationSpec = tween(50)), + ) { + Box( + modifier = Modifier + .background(Color(0x99E1D5FA), shape = RoundedCornerShape(10.dp)) + .padding(horizontal = 16.dp, vertical = 8.dp), + ) { + Text( + text = currentItem.emotionMarbleName, + style = BitnagilTheme.typography.title3SemiBold, + color = Color(0xFF692BD0), + ) + } + } + } +} + +@Composable +private fun EmotionPagerItem( + emotion: EmotionUiModel, + pagerState: PagerState, + page: Int, + size: Dp, + maximumDraggableYOffset: Float = Float.MAX_VALUE, + enabled: Boolean, + onSelectEmotion: (String) -> Unit, +) { + val pageOffset = ( + (pagerState.currentPage - page) + pagerState.currentPageOffsetFraction + ).absoluteValue + + val offsetY = remember { Animatable(0f) } + val coroutineScope = rememberCoroutineScope() + + EmotionMarbleImage( + image = emotion.image, + modifier = Modifier + .size(size) + .aspectRatio(1f) + .graphicsLayer { + translationY = lerp(size.value * 1f, 0f, pageOffset) + } + .offset { + IntOffset(0, offsetY.value.toInt()) + } + .draggable( + orientation = Orientation.Vertical, + enabled = (pageOffset == 0f && enabled), + state = rememberDraggableState { deltaY -> + coroutineScope.launch { + val newOffsetY = offsetY.value + deltaY + if (newOffsetY in 0f..maximumDraggableYOffset) { + offsetY.snapTo(newOffsetY) + } + } + }, + onDragStopped = { + coroutineScope.launch { + val targetOffsetY = if (offsetY.value >= maximumDraggableYOffset * 0.8) { + onSelectEmotion(emotion.emotionType) + maximumDraggableYOffset + } else { + 0f + } + + offsetY.animateTo( + targetValue = targetOffsetY, + animationSpec = tween(durationMillis = 300) + ) + } + }, + ) + .background(color = BitnagilTheme.colors.coolGray98), + ) +} + +@Preview(widthDp = 360, heightDp = 800) +@Composable +private fun Preview() { + BitnagilTheme { + SwipeEmotionSelectionScreen( + state = EmotionState( + emotionTypeUiModels = listOf( + EmotionUiModel( + emotionType = "emotionType", + emotionMarbleName = "구슬 이름 1", + image = EmotionImageUiModel.Url( + url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + offlineBackupImageResourceId = null, + ), + ), + EmotionUiModel( + emotionType = "emotionType", + emotionMarbleName = "구슬 이름 2", + image = EmotionImageUiModel.Url( + url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", + offlineBackupImageResourceId = null, + ), + ), + EmotionUiModel.Default + ), + isLoading = false, + step = EmotionScreenStep.Emotion, + recommendRoutines = listOf(), + ), + onClickPreviousButton = {}, + onSelectEmotion = {}, + ) + } +} From 55e0863f3281a42461550069af8b8ef54e8b5ec5 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Mon, 8 Sep 2025 20:27:46 +0900 Subject: [PATCH 05/12] =?UTF-8?q?FEAT:=20=EA=B0=90=EC=A0=95=EA=B5=AC?= =?UTF-8?q?=EC=8A=AC=20=EB=A6=AC=EB=94=94=EC=9E=90=EC=9D=B8=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=84=B8=EB=B6=80=20=EC=A1=B0=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B0=90=EC=A0=95=20=EA=B5=AC=EC=8A=AC=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EC=97=90=20=EB=B0=B0=EA=B2=BD/=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=83=89=EC=83=81=20=EB=B3=80=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/emotion/EmotionScreen.kt | 6 +- .../component/atom/EmotionMarbleImage.kt | 2 + .../template/SwipeEmotionSelectionScreen.kt | 186 +++++++++++------- .../emotion/model/EmotionUiModel.kt | 45 +++++ 4 files changed, 166 insertions(+), 73 deletions(-) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt index f44722f8..0f605f22 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.getValue import androidx.hilt.navigation.compose.hiltViewModel import com.threegap.bitnagil.presentation.common.flow.collectAsEffect import com.threegap.bitnagil.presentation.emotion.component.template.EmotionRecommendRoutineScreen -import com.threegap.bitnagil.presentation.emotion.component.template.SimpleEmotionSelectionScreen +import com.threegap.bitnagil.presentation.emotion.component.template.SwipeEmotionSelectionScreen import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionSideEffect @@ -29,10 +29,10 @@ fun EmotionScreenContainer( } when (state.step) { - EmotionScreenStep.Emotion -> SimpleEmotionSelectionScreen( + EmotionScreenStep.Emotion -> SwipeEmotionSelectionScreen( state = state, onClickPreviousButton = navigateToBack, - onClickEmotion = viewModel::selectEmotion, + onSelectEmotion = viewModel::selectEmotion, ) EmotionScreenStep.RecommendRoutines -> EmotionRecommendRoutineScreen( state = state, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt index 8fcd1a75..cdef2482 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt @@ -15,6 +15,7 @@ fun EmotionMarbleImage( modifier: Modifier, image: EmotionImageUiModel, contentDescription: String? = null, + alpha: Float = 1f, ) { when (image) { is EmotionImageUiModel.Url -> { @@ -25,6 +26,7 @@ fun EmotionMarbleImage( .build(), modifier = modifier, contentDescription = null, + alpha = alpha, error = image.offlineBackupImageResourceId?.let { painterResource(it) }, ) } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt index a75ed55a..89991733 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt @@ -1,6 +1,8 @@ package com.threegap.bitnagil.presentation.emotion.component.template import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn @@ -67,7 +69,6 @@ import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlin.math.absoluteValue -import kotlin.math.max @Composable fun SwipeEmotionSelectionScreen( @@ -75,6 +76,28 @@ fun SwipeEmotionSelectionScreen( onClickPreviousButton: () -> Unit, onSelectEmotion: (String) -> Unit, ) { + val fadeInTransition = remember { fadeIn(animationSpec = tween(150)) } + val fadeOutTransition = remember { fadeOut(animationSpec = tween(50)) } + + val emotions = remember(state.emotionTypeUiModels) { state.emotionTypeUiModels + EmotionUiModel.Default } + val actualItemCount = emotions.size + + val pagerState = rememberPagerState( + initialPage = Int.MAX_VALUE / 2 - (Int.MAX_VALUE / 2 % actualItemCount), + pageCount = { Int.MAX_VALUE }, + ) + var showText by remember { mutableStateOf(true) } + val currentItem = emotions[pagerState.currentPage % actualItemCount] + + LaunchedEffect(pagerState.isScrollInProgress) { + if (pagerState.isScrollInProgress) { + showText = false + } else { + delay(250) + showText = true + } + } + Column( modifier = Modifier .fillMaxSize() @@ -99,47 +122,21 @@ fun SwipeEmotionSelectionScreen( ) { state.emotionTypeUiModels.forEach { emotion -> EmotionMarbleImage( - modifier = Modifier - .size(40.dp) - .background(color = BitnagilTheme.colors.coolGray98), + modifier = Modifier.size(40.dp), image = emotion.image, + alpha = if (emotion.emotionType == currentItem.emotionType) 1f else 0.3f ) } } Spacer(modifier = Modifier.height(26.dp)) - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Box( - modifier = Modifier - .background(Color(0xFFEFECFF), shape = RoundedCornerShape(12.dp)) - .padding(20.dp), - contentAlignment = Alignment.Center, - ) { - Text( - "평온함은 마음이 고요하고 편안해\n균형을 이루는 상태에요", - style = BitnagilTheme.typography.cafe24SsurroundAir2.copy(color = Color(0xFF692BD0)), - textAlign = TextAlign.Center, - ) - } - - Canvas( - modifier = Modifier - .height(10.dp) - .width(24.dp), - ) { - val path = Path().apply { - moveTo(0f, 0f) - lineTo(size.width, 0f) - lineTo(size.width / 2 , size.height) - lineTo(0f, 0f) - close() - } - drawPath(path, color = Color(0xFFEFECFF)) - } - } + EmotionDescriptionText( + emotion = currentItem, + showText = showText, + enterTransition = fadeInTransition, + exitTransition = fadeOutTransition + ) Spacer(modifier = Modifier.height(16.dp)) @@ -149,10 +146,15 @@ fun SwipeEmotionSelectionScreen( EmotionPager( modifier = Modifier .fillMaxSize() + .padding(bottom = 90.dp) .zIndex(1f), - emotions = state.emotionTypeUiModels, + emotions = emotions, enabled = !state.isLoading, onSelectEmotion = onSelectEmotion, + pagerState = pagerState, + showText = showText, + marbleNameTextEnterTransition = fadeInTransition, + marbleNameTextExitTransition = fadeOutTransition, ) Column( @@ -160,7 +162,7 @@ fun SwipeEmotionSelectionScreen( horizontalAlignment = Alignment.CenterHorizontally, ) { GestureDescriptionText( - currentEmotionSelectable = state.emotionTypeUiModels.any { it.selectable }, + currentEmotionSelectable = currentItem.selectable, ) Spacer(modifier = Modifier.height(12.dp)) @@ -187,6 +189,58 @@ fun SwipeEmotionSelectionScreen( } } +@Composable +private fun EmotionDescriptionText( + emotion: EmotionUiModel, + showText: Boolean, + enterTransition: EnterTransition, + exitTransition: ExitTransition, +) { + Box( + modifier = Modifier.height(102.dp) + ) { + AnimatedVisibility( + visible = emotion.message != null && showText, + enter = enterTransition, + exit = exitTransition, + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Box( + modifier = Modifier + .background(Color(emotion.symbolBackgroundColor), shape = RoundedCornerShape(12.dp)) + .padding(20.dp), + contentAlignment = Alignment.Center, + ) { + Text( + text = emotion.message ?: "", + style = BitnagilTheme.typography.cafe24SsurroundAir2.copy(color = Color(emotion.symbolColor)), + textAlign = TextAlign.Center, + maxLines = 2, + minLines = 2, + ) + } + + Canvas( + modifier = Modifier + .height(10.dp) + .width(24.dp), + ) { + val path = Path().apply { + moveTo(0f, 0f) + lineTo(size.width, 0f) + lineTo(size.width / 2, size.height) + lineTo(0f, 0f) + close() + } + drawPath(path, color = Color(emotion.symbolBackgroundColor)) + } + } + } + } +} + @Composable private fun GestureDescriptionText( currentEmotionSelectable: Boolean, @@ -237,25 +291,12 @@ private fun EmotionPager( emotions: List, enabled: Boolean, onSelectEmotion: (String) -> Unit, + pagerState: PagerState, + showText: Boolean, + marbleNameTextEnterTransition: EnterTransition, + marbleNameTextExitTransition: ExitTransition, ) { - val actualItemCount = max(1, emotions.size) - - val pagerState = rememberPagerState( - initialPage = Int.MAX_VALUE / 2 - (Int.MAX_VALUE / 2 % actualItemCount), - pageCount = { Int.MAX_VALUE }, - ) - - var showText by remember { mutableStateOf(true) } - val currentItem = emotions[pagerState.currentPage % actualItemCount] - - LaunchedEffect(pagerState.isScrollInProgress) { - if (pagerState.isScrollInProgress) { - showText = false - } else { - delay(500) - showText = true - } - } + val currentItem = emotions[pagerState.currentPage % emotions.size] BoxWithConstraints( modifier = modifier, @@ -264,9 +305,10 @@ private fun EmotionPager( val density = LocalDensity.current val screenWidth = with(density) { constraints.maxWidth.toDp() } - val itemWidth = 140.dp - val contentPadding = (screenWidth - itemWidth) / 2 - val pageSpacing = ((screenWidth - itemWidth * 2) / 2) + val itemSize = 140.dp + val centerItemYOffset = 50.dp + val contentPadding = (screenWidth - itemSize) / 2 + val pageSpacing = ((screenWidth - itemSize * 2) / 2) HorizontalPager( modifier = Modifier.fillMaxHeight(), @@ -275,32 +317,33 @@ private fun EmotionPager( contentPadding = PaddingValues(horizontal = contentPadding), verticalAlignment = Alignment.Top, ) { page -> - val itemIndex = page % actualItemCount + val itemIndex = page % emotions.size EmotionPagerItem( emotion = emotions[itemIndex], pagerState = pagerState, page = page, - size = itemWidth, - maximumDraggableYOffset = constraints.maxHeight - 280.dp.dpToPx(), - enabled = enabled, + size = itemSize, + centerItemYOffset = centerItemYOffset.dpToPx(), + maximumDraggableYOffset = constraints.maxHeight - (itemSize + centerItemYOffset).dpToPx(), + enabled = enabled && emotions[itemIndex].selectable, onSelectEmotion = onSelectEmotion, ) } AnimatedVisibility( visible = showText, - enter = fadeIn(animationSpec = tween(150)), - exit = fadeOut(animationSpec = tween(50)), + enter = marbleNameTextEnterTransition, + exit = marbleNameTextExitTransition, ) { Box( modifier = Modifier - .background(Color(0x99E1D5FA), shape = RoundedCornerShape(10.dp)) + .background(Color(currentItem.symbolBackgroundColor), shape = RoundedCornerShape(10.dp)) .padding(horizontal = 16.dp, vertical = 8.dp), ) { Text( text = currentItem.emotionMarbleName, style = BitnagilTheme.typography.title3SemiBold, - color = Color(0xFF692BD0), + color = Color(currentItem.symbolColor), ) } } @@ -313,6 +356,7 @@ private fun EmotionPagerItem( pagerState: PagerState, page: Int, size: Dp, + centerItemYOffset: Float, maximumDraggableYOffset: Float = Float.MAX_VALUE, enabled: Boolean, onSelectEmotion: (String) -> Unit, @@ -330,7 +374,7 @@ private fun EmotionPagerItem( .size(size) .aspectRatio(1f) .graphicsLayer { - translationY = lerp(size.value * 1f, 0f, pageOffset) + translationY = lerp(start = centerItemYOffset * 1f, stop = 0f, pageOffset) } .offset { IntOffset(0, offsetY.value.toInt()) @@ -361,8 +405,7 @@ private fun EmotionPagerItem( ) } }, - ) - .background(color = BitnagilTheme.colors.coolGray98), + ), ) } @@ -380,6 +423,8 @@ private fun Preview() { url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", offlineBackupImageResourceId = null, ), + symbolBackgroundColor = 0xFFEFECFF, + symbolColor = 0xFF692BD0, ), EmotionUiModel( emotionType = "emotionType", @@ -388,8 +433,9 @@ private fun Preview() { url = "https://bitnagil-s3.s3.ap-northeast-2.amazonaws.com/home_satisfaction.png", offlineBackupImageResourceId = null, ), + symbolBackgroundColor = 0xFFE9FAD0, + symbolColor = 0xFF609F00, ), - EmotionUiModel.Default ), isLoading = false, step = EmotionScreenStep.Emotion, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt index 871b9484..1cde5e06 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt @@ -11,6 +11,9 @@ data class EmotionUiModel( val emotionMarbleName: String, val image: EmotionImageUiModel, val selectable: Boolean = true, + val message: String? = null, + val symbolBackgroundColor: Long = 0xFFEAEBEC, + val symbolColor: Long = 0xFF878A93, ) : Parcelable { companion object { fun fromDomain(emotion: Emotion) = EmotionUiModel( @@ -20,6 +23,9 @@ data class EmotionUiModel( url = emotion.imageUrl, offlineBackupImageResourceId = getOfflineBackupImageResourceId(emotion.emotionType) ), + message = getMessage(emotion.emotionType), + symbolBackgroundColor = getSymbolBackgroundColorString(emotion.emotionType), + symbolColor = getSymbolColorString(emotion.emotionType) ) private fun getOfflineBackupImageResourceId(emotionType: String): Int? { @@ -34,11 +40,50 @@ data class EmotionUiModel( } } + private fun getMessage(emotionType: String): String? { + return when (emotionType) { + "CALM" -> "평온함은 마음이 고요하고 편안해\n균형을 이루는 상태에요" + "VITALITY" -> "활기참은 생기가 가득 차\n활발하고 적극적인 상태예요." + "LETHARGY" -> "무기력함은 의욕이 없어 아무것도\n하기 힘든 상태예요." + "ANXIETY" -> "불안함은 마음이 불안정하고 쉽게\n안심하기 어려운 상태예요." + "SATISFACTION" -> "만족함은 기대가 충족되어\n더 바랄 것이 없는 상태예요." + "FATIGUE" -> "피곤함은 몸과 마음이 지쳐\n휴식이 필요한 상태예요." + else -> null + } + } + + private fun getSymbolBackgroundColorString(emotionType: String): Long { + return when (emotionType) { + "CALM" -> 0xFFEFECFF + "VITALITY" -> 0xFFE9FAD0 + "LETHARGY" -> 0xFFEAEBEC + "ANXIETY" -> 0xFFFFEEE4 + "SATISFACTION" -> 0xFFE2F3F6 + "FATIGUE" -> 0xFFFFE1E1 + else -> 0xFFEAEBEC + } + } + + private fun getSymbolColorString(emotionType: String): Long { + return when (emotionType) { + "CALM" -> 0xFF692BD0 + "VITALITY" -> 0xFF609F00 + "LETHARGY" -> 0xFF5A5C63 + "ANXIETY" -> 0xFFFE7120 + "SATISFACTION" -> 0xFF26A792 + "FATIGUE" -> 0xFFFF5151 + else -> 0xFF878A93 + } + } + val Default = EmotionUiModel( emotionType = "NONE", emotionMarbleName = "구슬 선택", image = EmotionImageUiModel.Resource(R.drawable.default_marble), selectable = false, + message = "오늘 기분 어때요?\n기록해 두면 내 루틴에 도움 돼요!", + symbolBackgroundColor = 0xFFEAEBEC, + symbolColor = 0xFF171719 ) } } From b3ea5cdd64349c04dc5264263ef9b9f5a972376e Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Mon, 8 Sep 2025 20:34:06 +0900 Subject: [PATCH 06/12] =?UTF-8?q?CHORE:=20ktlint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dimension/{dpToPx.kt => DpToPx.kt} | 1 - .../emotion/component/atom/EmotionMarbleImage.kt | 8 ++++---- .../template/SimpleEmotionSelectionScreen.kt | 2 +- .../template/SwipeEmotionSelectionScreen.kt | 12 ++++++------ .../presentation/emotion/model/EmotionUiModel.kt | 6 +++--- 5 files changed, 14 insertions(+), 15 deletions(-) rename presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/{dpToPx.kt => DpToPx.kt} (99%) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/dpToPx.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/DpToPx.kt similarity index 99% rename from presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/dpToPx.kt rename to presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/DpToPx.kt index e6893980..bd006739 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/dpToPx.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/DpToPx.kt @@ -4,6 +4,5 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Dp - @Composable fun Dp.dpToPx() = with(LocalDensity.current) { this@dpToPx.toPx() } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt index cdef2482..dc82121c 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt @@ -12,10 +12,10 @@ import com.threegap.bitnagil.presentation.emotion.model.EmotionImageUiModel @Composable fun EmotionMarbleImage( - modifier: Modifier, - image: EmotionImageUiModel, - contentDescription: String? = null, - alpha: Float = 1f, + modifier: Modifier, + image: EmotionImageUiModel, + contentDescription: String? = null, + alpha: Float = 1f, ) { when (image) { is EmotionImageUiModel.Url -> { diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt index b77628ea..7f6dd49e 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt @@ -48,7 +48,7 @@ fun SimpleEmotionSelectionScreen( Box( modifier = Modifier.fillMaxHeight(), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { LazyVerticalGrid( columns = GridCells.Fixed(3), diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt index 89991733..6421c234 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt @@ -124,7 +124,7 @@ fun SwipeEmotionSelectionScreen( EmotionMarbleImage( modifier = Modifier.size(40.dp), image = emotion.image, - alpha = if (emotion.emotionType == currentItem.emotionType) 1f else 0.3f + alpha = if (emotion.emotionType == currentItem.emotionType) 1f else 0.3f, ) } } @@ -135,7 +135,7 @@ fun SwipeEmotionSelectionScreen( emotion = currentItem, showText = showText, enterTransition = fadeInTransition, - exitTransition = fadeOutTransition + exitTransition = fadeOutTransition, ) Spacer(modifier = Modifier.height(16.dp)) @@ -197,7 +197,7 @@ private fun EmotionDescriptionText( exitTransition: ExitTransition, ) { Box( - modifier = Modifier.height(102.dp) + modifier = Modifier.height(102.dp), ) { AnimatedVisibility( visible = emotion.message != null && showText, @@ -247,7 +247,7 @@ private fun GestureDescriptionText( ) { if (currentEmotionSelectable) { Column( - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Text("선택한 감정 구슬을 아래로 놓아주세요", style = BitnagilTheme.typography.body2Medium.copy(color = BitnagilTheme.colors.coolGray50)) @@ -262,7 +262,7 @@ private fun GestureDescriptionText( } else { Row( horizontalArrangement = Arrangement.spacedBy(26.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Image( painter = painterResource(R.drawable.ic_double_left_arrow_24), @@ -401,7 +401,7 @@ private fun EmotionPagerItem( offsetY.animateTo( targetValue = targetOffsetY, - animationSpec = tween(durationMillis = 300) + animationSpec = tween(durationMillis = 300), ) } }, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt index 1cde5e06..3e6ff51b 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt @@ -21,11 +21,11 @@ data class EmotionUiModel( emotionMarbleName = emotion.emotionMarbleName, image = EmotionImageUiModel.Url( url = emotion.imageUrl, - offlineBackupImageResourceId = getOfflineBackupImageResourceId(emotion.emotionType) + offlineBackupImageResourceId = getOfflineBackupImageResourceId(emotion.emotionType), ), message = getMessage(emotion.emotionType), symbolBackgroundColor = getSymbolBackgroundColorString(emotion.emotionType), - symbolColor = getSymbolColorString(emotion.emotionType) + symbolColor = getSymbolColorString(emotion.emotionType), ) private fun getOfflineBackupImageResourceId(emotionType: String): Int? { @@ -83,7 +83,7 @@ data class EmotionUiModel( selectable = false, message = "오늘 기분 어때요?\n기록해 두면 내 루틴에 도움 돼요!", symbolBackgroundColor = 0xFFEAEBEC, - symbolColor = 0xFF171719 + symbolColor = 0xFF171719, ) } } From da55196a372c2c79f90b7f7e15fdc345af0f072d Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Tue, 9 Sep 2025 20:16:09 +0900 Subject: [PATCH 07/12] =?UTF-8?q?FIX:=20=EA=B0=90=EC=A0=95=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=A4=91=20=ED=83=80=EC=9E=84=EC=95=84=EC=9B=83?= =?UTF-8?q?=EA=B3=BC=20=EA=B0=99=EC=9D=80=20=EC=97=90=EB=9F=AC=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=EC=8B=9C=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=ED=9B=84=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/emotion/EmotionScreen.kt | 9 ++++++++- .../presentation/emotion/EmotionViewModel.kt | 18 ++++++++++++++++-- .../template/SwipeEmotionSelectionScreen.kt | 1 + .../emotion/model/mvi/EmotionIntent.kt | 1 + .../emotion/model/mvi/EmotionSideEffect.kt | 1 + 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt index 0f605f22..105e8f14 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt @@ -4,8 +4,10 @@ import androidx.activity.compose.BackHandler import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.hilt.navigation.compose.hiltViewModel import com.threegap.bitnagil.presentation.common.flow.collectAsEffect +import com.threegap.bitnagil.presentation.common.toast.GlobalBitnagilToast import com.threegap.bitnagil.presentation.emotion.component.template.EmotionRecommendRoutineScreen import com.threegap.bitnagil.presentation.emotion.component.template.SwipeEmotionSelectionScreen import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep @@ -25,6 +27,7 @@ fun EmotionScreenContainer( viewModel.sideEffectFlow.collectAsEffect { sideEffect -> when (sideEffect) { EmotionSideEffect.NavigateToBack -> navigateToBack() + is EmotionSideEffect.ShowToast -> GlobalBitnagilToast.showWarning(sideEffect.message) } } @@ -32,7 +35,11 @@ fun EmotionScreenContainer( EmotionScreenStep.Emotion -> SwipeEmotionSelectionScreen( state = state, onClickPreviousButton = navigateToBack, - onSelectEmotion = viewModel::selectEmotion, + onSelectEmotion = remember { + { emotionType -> + viewModel.selectEmotion(emotionType = emotionType, minimumDelay = 1000) + } + }, ) EmotionScreenStep.RecommendRoutines -> EmotionRecommendRoutineScreen( state = state, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt index 5e95dd86..afab3f5f 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt @@ -13,6 +13,7 @@ import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionIntent import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionSideEffect import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.orbitmvi.orbit.syntax.simple.SimpleSyntax import javax.inject.Inject @@ -103,22 +104,35 @@ class EmotionViewModel @Inject constructor( sendSideEffect(EmotionSideEffect.NavigateToBack) return null } + + is EmotionIntent.RegisterEmotionFailure -> { + sendSideEffect(EmotionSideEffect.ShowToast(intent.message)) + sendSideEffect(EmotionSideEffect.NavigateToBack) + return null + } } } - fun selectEmotion(emotionType: String) { + fun selectEmotion(emotionType: String, minimumDelay: Long = 0) { val isLoading = stateFlow.value.isLoading if (isLoading) return viewModelScope.launch { sendIntent(EmotionIntent.RegisterEmotionLoading) + + if (minimumDelay > 0) { + delay(minimumDelay) + } + registerEmotionUseCase(emotionType = emotionType).fold( onSuccess = { emotionRecommendRoutines -> val recommendRoutines = emotionRecommendRoutines.map { EmotionRecommendRoutineUiModel.fromEmotionRecommendRoutine(it) } sendIntent(EmotionIntent.RegisterEmotionSuccess(recommendRoutines)) }, onFailure = { - // todo 실패 케이스 정의되면 처리 + sendIntent( + EmotionIntent.RegisterEmotionFailure(message = it.message ?: "에러가 발생했습니다. 잠시 후 시도해주세요."), + ) }, ) } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt index 6421c234..abbad4ad 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt @@ -316,6 +316,7 @@ private fun EmotionPager( pageSpacing = pageSpacing, contentPadding = PaddingValues(horizontal = contentPadding), verticalAlignment = Alignment.Top, + userScrollEnabled = enabled, ) { page -> val itemIndex = page % emotions.size EmotionPagerItem( diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionIntent.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionIntent.kt index 49b62216..9e155caa 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionIntent.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionIntent.kt @@ -8,6 +8,7 @@ sealed class EmotionIntent : MviIntent { data class EmotionListLoadSuccess(val emotionTypeUiModels: List) : EmotionIntent() data class RegisterEmotionSuccess(val recommendRoutines: List) : EmotionIntent() data object RegisterEmotionLoading : EmotionIntent() + data class RegisterEmotionFailure(val message: String) : EmotionIntent() data object RegisterRecommendRoutinesLoading : EmotionIntent() data object RegisterRecommendRoutinesSuccess : EmotionIntent() data object RegisterRecommendRoutinesFailure : EmotionIntent() diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionSideEffect.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionSideEffect.kt index 819135c1..b039ec89 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionSideEffect.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionSideEffect.kt @@ -4,4 +4,5 @@ import com.threegap.bitnagil.presentation.common.mviviewmodel.MviSideEffect sealed class EmotionSideEffect : MviSideEffect { data object NavigateToBack : EmotionSideEffect() + data class ShowToast(val message: String) : EmotionSideEffect() } From 7c76a1a64ce7a3b4ff67e7c92d54d7fbbe07812d Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Tue, 9 Sep 2025 21:36:50 +0900 Subject: [PATCH 08/12] =?UTF-8?q?FEAT:=20=EA=B0=90=EC=A0=95=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=A4=91=20=ED=91=9C=EC=8B=9C=EB=90=A0=20=EB=A1=9C?= =?UTF-8?q?=EB=94=A9=20UI=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=95=B4?= =?UTF-8?q?=EB=8B=B9=20=ED=99=94=EB=A9=B4=EC=97=90=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/drawable-hdpi/img_ground.png | Bin 0 -> 6008 bytes .../res/drawable-hdpi/img_marble_pomo.png | Bin 0 -> 9205 bytes .../img_marble_pomo_left_hand.png | Bin 0 -> 1507 bytes .../img_marble_pomo_right_hand.png | Bin 0 -> 1516 bytes .../src/main/res/drawable-mdpi/img_ground.png | Bin 0 -> 3680 bytes .../res/drawable-mdpi/img_marble_pomo.png | Bin 0 -> 5908 bytes .../img_marble_pomo_left_hand.png | Bin 0 -> 909 bytes .../img_marble_pomo_right_hand.png | Bin 0 -> 1008 bytes .../main/res/drawable-xhdpi/img_ground.png | Bin 0 -> 8349 bytes .../res/drawable-xhdpi/img_marble_pomo.png | Bin 0 -> 12737 bytes .../img_marble_pomo_left_hand.png | Bin 0 -> 2043 bytes .../img_marble_pomo_right_hand.png | Bin 0 -> 2074 bytes .../main/res/drawable-xxhdpi/img_ground.png | Bin 0 -> 13247 bytes .../res/drawable-xxhdpi/img_marble_pomo.png | Bin 0 -> 20379 bytes .../img_marble_pomo_left_hand.png | Bin 0 -> 2970 bytes .../img_marble_pomo_right_hand.png | Bin 0 -> 3122 bytes .../main/res/drawable-xxxhdpi/img_ground.png | Bin 0 -> 18701 bytes .../res/drawable-xxxhdpi/img_marble_pomo.png | Bin 0 -> 28509 bytes .../img_marble_pomo_left_hand.png | Bin 0 -> 4215 bytes .../img_marble_pomo_right_hand.png | Bin 0 -> 4303 bytes .../presentation/common/dimension/PxToDp.kt | 7 + .../presentation/emotion/EmotionViewModel.kt | 2 + .../component/atom/SpeechBubbleText.kt | 87 ++++++++ .../component/template/EmotionLoadingView.kt | 190 ++++++++++++++++++ .../template/EmotionRecommendRoutineScreen.kt | 1 + .../template/SimpleEmotionSelectionScreen.kt | 1 + .../template/SwipeEmotionSelectionScreen.kt | 149 +++++++------- .../emotion/model/mvi/EmotionState.kt | 2 + 28 files changed, 371 insertions(+), 68 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable-hdpi/img_ground.png create mode 100644 core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo.png create mode 100644 core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo_left_hand.png create mode 100644 core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo_right_hand.png create mode 100644 core/designsystem/src/main/res/drawable-mdpi/img_ground.png create mode 100644 core/designsystem/src/main/res/drawable-mdpi/img_marble_pomo.png create mode 100644 core/designsystem/src/main/res/drawable-mdpi/img_marble_pomo_left_hand.png create mode 100644 core/designsystem/src/main/res/drawable-mdpi/img_marble_pomo_right_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xhdpi/img_ground.png create mode 100644 core/designsystem/src/main/res/drawable-xhdpi/img_marble_pomo.png create mode 100644 core/designsystem/src/main/res/drawable-xhdpi/img_marble_pomo_left_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xhdpi/img_marble_pomo_right_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xxhdpi/img_ground.png create mode 100644 core/designsystem/src/main/res/drawable-xxhdpi/img_marble_pomo.png create mode 100644 core/designsystem/src/main/res/drawable-xxhdpi/img_marble_pomo_left_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xxhdpi/img_marble_pomo_right_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xxxhdpi/img_ground.png create mode 100644 core/designsystem/src/main/res/drawable-xxxhdpi/img_marble_pomo.png create mode 100644 core/designsystem/src/main/res/drawable-xxxhdpi/img_marble_pomo_left_hand.png create mode 100644 core/designsystem/src/main/res/drawable-xxxhdpi/img_marble_pomo_right_hand.png create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/SpeechBubbleText.kt create mode 100644 presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionLoadingView.kt diff --git a/core/designsystem/src/main/res/drawable-hdpi/img_ground.png b/core/designsystem/src/main/res/drawable-hdpi/img_ground.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa97bdee5c5615b8b5ae4f09c44066fec96176f GIT binary patch literal 6008 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 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo.png b/core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo.png new file mode 100644 index 0000000000000000000000000000000000000000..792cb97468a690584ebcd56d829e0d8e0786d297 GIT binary patch literal 9205 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 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo_left_hand.png b/core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo_left_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..75b024b0e407fdc3605049501fc7d440ce38524e GIT binary patch literal 1507 zcmV<91swW`P)KdTmrX(xPx#jfDS?j_*Rf~fKvh7=RBBHU^+10W1dI{`gU!L2qFIw|Hw9T z&Ya*JLhSMEYPFI93=l%hh(}^T^oR~_I0uQc6_;>v!w*=HudlDo@px24if)d&ghv#< z@85*Vflm|<4-X;?Lp}5Y;sQ4yAPUL1w>LwYip6p;Vw{P@oXuu>_>DdUBWNN?I*ucv zC{l$A)3U+A$RLVn$W@FbMgj*VL}Et;L0}SUg%Q9-36Y?P<$2!dgmO_qB+12Mp$oMZ z1FqB;xI!f6a=9E$_<6WeB&O@Srd+id+UV!w7a~bcr&GODkRj+`00>ZnNJx|Vc57-X z^nYqon@CWSy1`Y9u&>UFP_sx-@|9s~)5|avO_Rg0&tf@fK_nE1;mT&QT(l?>ip8=r zZ_UtwNGKNTn1&)(t1fYhmM}5=j%V?&=olmxsLsOU<0Gh#mG!m*@jv1YNt*bcOeTA@ z01q8H3DrX}D?Asd2_`4`#5pVkjff{wDS@Y_r}%YA_{9H-59#r~tm{l71xS*&^4+ao4hB-F@9)Gg?6&9U=h%HI4#a=*9Hqjlq}?RB>erUaN{#AHS0~&RdGS@R^icq} z>yz$+hHk2h9CTW3cS-I}Ckmzym^75h!mZTP~&vvN)&AOi9|%S@2N; zy}IbCG%Ulbh(w9*r(?r~G)WFMZL{pDE)pf%!){k6-zE*!^^RD&^chXHZRm7{WrZ45 zwQbna=%EC>u1~xRp_ClOFBT|(-{lE+MMI8SAqRmiC*C%zY-JpLwVg-aqprcYnlR{U zy9~9^JDNtkUR_XA)Oy~YDv)FANw-a{Dv#ZCr-*a|ftQ@#-{0jShuic{Ik+LkcDq#% zXLn?$>Bq;%oEPtINWe?x3LJivG&%(!#Ugj<(6c;JH`TtA;FS|qB#HHU9q+;J(}mSZ zZFyUCr4D!vWV^h1o` zf6k9^aeK7wi?1q__WW?%aJx#J9MSj#*CJVEF#DBiE*6X@jJCQ=dnV6AQ%GGFW?&ay@%iBzl;xOBiTMKTTPRX$hSA7IC~V+bwDb6*)X2&FrU zh2v>P(cfxYZ#>unq10M+xQUtZeFUdcgu_aTCiic1Xlf{5Wj76xB=plAuVb_;*j97q zu&kXWunj_)>eL~WCX$~r66J8+RHSL7Zu+U@=Bu(ldV?WSv-{UkZ#zq7FnNT>VQZdX}I==Bqyl^`+}Byvz{m)fM1ilibH%tay^KO@VJtMAYf{sJVo76v_(!BhYM002ov JPDHLkV1i;g$ZP-r literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo_right_hand.png b/core/designsystem/src/main/res/drawable-hdpi/img_marble_pomo_right_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..c919fde25864156ddfeeefbcea55bf9918fa5910 GIT binary patch literal 1516 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 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xhdpi/img_marble_pomo.png b/core/designsystem/src/main/res/drawable-xhdpi/img_marble_pomo.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6f004fecbc818c6c87505136626dbd95416a5c GIT binary patch literal 12737 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 z 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 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xhdpi/img_marble_pomo_left_hand.png b/core/designsystem/src/main/res/drawable-xhdpi/img_marble_pomo_left_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7235a3299657746ced1fdb3214c0a880a641b4 GIT binary patch literal 2043 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 literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xxhdpi/img_marble_pomo_left_hand.png b/core/designsystem/src/main/res/drawable-xxhdpi/img_marble_pomo_left_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..19fbf123d97df073b4265444e5b00a89882f6978 GIT binary patch literal 2970 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 QbpQYW07*qoM6N<$f;-8Q%m4rY literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xxhdpi/img_marble_pomo_right_hand.png b/core/designsystem/src/main/res/drawable-xxhdpi/img_marble_pomo_right_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..abd3c12acd18e5e67b66f45790cb233fa7eb4a10 GIT binary patch literal 3122 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 M07*qoM6N<$f)9z@GXMYp literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xxxhdpi/img_ground.png b/core/designsystem/src/main/res/drawable-xxxhdpi/img_ground.png new file mode 100644 index 0000000000000000000000000000000000000000..2922337592325dd96ef48972a8aaf1effde8cbc1 GIT binary patch literal 18701 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 IH%y-VFKB1;`~Uy| literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xxxhdpi/img_marble_pomo.png b/core/designsystem/src/main/res/drawable-xxxhdpi/img_marble_pomo.png new file mode 100644 index 0000000000000000000000000000000000000000..ba23b024f8e98765f0e1a327b2e759d339b973db GIT binary patch literal 28509 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 N002ovPDHLkV1j?!*m?i} literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable-xxxhdpi/img_marble_pomo_right_hand.png b/core/designsystem/src/main/res/drawable-xxxhdpi/img_marble_pomo_right_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..418d664c8544b8a87bdb5cd5f9502ef8ed26b8d2 GIT binary patch literal 4303 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 literal 0 HcmV?d00001 diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt new file mode 100644 index 00000000..8654af5f --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt @@ -0,0 +1,7 @@ +package com.threegap.bitnagil.presentation.common.dimension + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalDensity + +@Composable +fun Float.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt index afab3f5f..72cf4913 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt @@ -60,11 +60,13 @@ class EmotionViewModel @Inject constructor( recommendRoutines = intent.recommendRoutines, step = EmotionScreenStep.RecommendRoutines, isLoading = false, + showLoadingView = false, ) } EmotionIntent.RegisterEmotionLoading -> { return state.copy( isLoading = true, + showLoadingView = true, ) } EmotionIntent.RegisterRecommendRoutinesLoading -> { diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/SpeechBubbleText.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/SpeechBubbleText.kt new file mode 100644 index 00000000..1d90b7a7 --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/SpeechBubbleText.kt @@ -0,0 +1,87 @@ +package com.threegap.bitnagil.presentation.emotion.component.atom + +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.threegap.bitnagil.designsystem.BitnagilTheme + +@Composable +fun SpeechBubbleText( + text: String, + backgroundColor: Long, + textColor: Long, + modifier: Modifier = Modifier, + maxLines: Int = 2, + minLines: Int = 2, +) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Box( + modifier = Modifier + .background(Color(backgroundColor), shape = RoundedCornerShape(12.dp)) + .padding(20.dp), + contentAlignment = Alignment.Center, + ) { + Text( + text = text, + style = BitnagilTheme.typography.cafe24SsurroundAir2.copy(color = Color(textColor)), + textAlign = TextAlign.Center, + maxLines = maxLines, + minLines = minLines, + ) + } + + Canvas( + modifier = Modifier + .height(10.dp) + .width(24.dp), + ) { + val path = Path().apply { + moveTo(0f, 0f) + lineTo(size.width, 0f) + lineTo(size.width / 2, size.height) + lineTo(0f, 0f) + close() + } + drawPath(path, color = Color(backgroundColor)) + } + } +} + +@Preview +@Composable +private fun SpeechBubbleTextPreview() { + BitnagilTheme { + Column { + SpeechBubbleText( + text = "hi", + backgroundColor = 0xFFFFFFFF, + textColor = 0xFF000000, + minLines = 1, + ) + + SpeechBubbleText( + text = "안녕하세요?", + backgroundColor = 0xFF000000, + textColor = 0xFFFFFFFF, + minLines = 1, + ) + } + } +} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionLoadingView.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionLoadingView.kt new file mode 100644 index 00000000..fb58ed21 --- /dev/null +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionLoadingView.kt @@ -0,0 +1,190 @@ +package com.threegap.bitnagil.presentation.emotion.component.template + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import com.threegap.bitnagil.designsystem.BitnagilTheme +import com.threegap.bitnagil.designsystem.R +import com.threegap.bitnagil.presentation.common.dimension.pxToDp +import com.threegap.bitnagil.presentation.emotion.component.atom.EmotionMarbleImage +import com.threegap.bitnagil.presentation.emotion.component.atom.SpeechBubbleText +import com.threegap.bitnagil.presentation.emotion.model.EmotionUiModel + +@Composable +fun EmotionLoadingView( + emotion: EmotionUiModel, +) { + Box( + modifier = Modifier.fillMaxSize().background(BitnagilTheme.colors.white), + ) { + BackgroundBox(modifier = Modifier.fillMaxSize()) + + Column( + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomCenter), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + SpeechBubbleText( + text = getRecommendRoutineText(emotion), + backgroundColor = 0xFF000000, + textColor = 0xFFFFFFFF, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Box( + modifier = Modifier + .width(200.dp) + .height(280.dp) + .offset(y = 16.dp) + .zIndex(1f), + ) { + Image( + painter = painterResource(R.drawable.img_marble_pomo), + contentDescription = null, + ) + + Image( + modifier = Modifier + .offset(y = 117.dp, x = 18.dp) + .zIndex(2f), + painter = painterResource(R.drawable.img_marble_pomo_left_hand), + contentDescription = null, + ) + + Image( + modifier = Modifier + .align(Alignment.TopEnd) + .offset(y = 117.dp, x = (-17).dp) + .zIndex(2f), + painter = painterResource(R.drawable.img_marble_pomo_right_hand), + contentDescription = null, + ) + + EmotionMarbleImage( + modifier = Modifier + .size(120.dp) + .align(Alignment.TopCenter) + .offset(y = 97.dp) + .zIndex(1f), + image = emotion.image, + ) + } + + Image( + modifier = Modifier.height(150.dp).fillMaxWidth(), + painter = painterResource(R.drawable.img_ground), + contentDescription = null, + contentScale = ContentScale.FillBounds, + ) + } + } +} + +@Composable +private fun BackgroundBox(modifier: Modifier = Modifier) { + BoxWithConstraints(modifier = modifier) { + val height = constraints.maxHeight + val width = constraints.maxWidth + + BackgroundIcon( + iconResourceId = R.drawable.ic_wakeup, + offsetX = (width * 0.03f).pxToDp(), + offsetY = (height * 0.03f).pxToDp(), + ) + + BackgroundIcon( + iconResourceId = R.drawable.ic_rest, + offsetX = (width * 0.42f).pxToDp(), + offsetY = (height * 0.08f).pxToDp(), + ) + + BackgroundIcon( + iconResourceId = R.drawable.ic_shine, + offsetX = (width * 0.87f).pxToDp(), + offsetY = (height * 0.05f).pxToDp(), + ) + + BackgroundIcon( + iconResourceId = R.drawable.ic_grow, + offsetX = (width * -0.05f).pxToDp(), + offsetY = (height * 0.27f).pxToDp(), + ) + + BackgroundIcon( + iconResourceId = R.drawable.img_start_time, + offsetX = (width * 0.66f).pxToDp(), + offsetY = (height * 0.25f).pxToDp(), + ) + + BackgroundIcon( + iconResourceId = R.drawable.ic_outside, + offsetX = (width * -0.14f).pxToDp(), + offsetY = (height * 0.63f).pxToDp(), + ) + + BackgroundIcon( + iconResourceId = R.drawable.ic_connect, + offsetX = (width * 0.20f).pxToDp(), + offsetY = (height * 0.46f).pxToDp(), + ) + + BackgroundIcon( + iconResourceId = R.drawable.img_routine_period, + offsetX = (width * 0.93f).pxToDp(), + offsetY = (height * 0.54f).pxToDp(), + ) + } +} + +@Composable +private fun BackgroundIcon(iconResourceId: Int, offsetX: Dp, offsetY: Dp) { + Image( + modifier = Modifier.size(72.dp).offset(x = offsetX, y = offsetY), + painter = painterResource(iconResourceId), + colorFilter = ColorFilter.tint(BitnagilTheme.colors.coolGray98), + contentDescription = null, + ) +} + +private fun getRecommendRoutineText(emotion: EmotionUiModel): String { + return when (emotion.emotionType) { + "CALM" -> "평온한 하루에 맞춰\n루틴을 추천해드릴게요!" + "VITALITY" -> "활기찬 하루에 맞춰\n루틴을 추천해드릴게요!" + "LETHARGY" -> "무기력한 하루에 맞춰\n루틴을 추천해드릴게요!" + "ANXIETY" -> "불안한 하루에 맞춰\n루틴을 추천해드릴게요!" + "SATISFACTION" -> "만족스러운 하루에 맞춰\n루틴을 추천해드릴게요!" + "FATIGUE" -> "피곤한 하루에 맞춰\n루틴을 추천해드릴게요!" + else -> "감정에 맞춰\n루틴을 추천해드릴게요!" + } +} + +@Preview +@Composable +private fun EmotionLoadingViewPreview() { + BitnagilTheme { + EmotionLoadingView( + emotion = EmotionUiModel.Default, + ) + } +} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt index bda98f1f..d53a801e 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt @@ -128,6 +128,7 @@ private fun Preview() { selected = true, ), ), + showLoadingView = false, ), onClickRoutine = {}, onClickRegisterRecommendRoutines = {}, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt index 7f6dd49e..95e14dfd 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SimpleEmotionSelectionScreen.kt @@ -121,6 +121,7 @@ private fun Preview() { isLoading = false, step = EmotionScreenStep.Emotion, recommendRoutines = listOf(), + showLoadingView = false, ), onClickEmotion = { _ -> }, onClickPreviousButton = {}, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt index abbad4ad..7398231b 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt @@ -98,93 +98,105 @@ fun SwipeEmotionSelectionScreen( } } - Column( - modifier = Modifier - .fillMaxSize() - .background(color = BitnagilTheme.colors.white) - .statusBarsPadding(), - horizontalAlignment = Alignment.CenterHorizontally, + Box( + modifier = Modifier.fillMaxSize(), ) { - BitnagilTopBar( - showBackButton = true, - title = "오늘 감정 등록하기", - onBackClick = onClickPreviousButton, - ) - - Spacer(modifier = Modifier.height(20.dp)) - - Row( + Column( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, + .fillMaxSize() + .background(color = BitnagilTheme.colors.white) + .statusBarsPadding(), + horizontalAlignment = Alignment.CenterHorizontally, ) { - state.emotionTypeUiModels.forEach { emotion -> - EmotionMarbleImage( - modifier = Modifier.size(40.dp), - image = emotion.image, - alpha = if (emotion.emotionType == currentItem.emotionType) 1f else 0.3f, - ) - } - } + BitnagilTopBar( + showBackButton = true, + title = "오늘 감정 등록하기", + onBackClick = onClickPreviousButton, + ) - Spacer(modifier = Modifier.height(26.dp)) + Spacer(modifier = Modifier.height(20.dp)) - EmotionDescriptionText( - emotion = currentItem, - showText = showText, - enterTransition = fadeInTransition, - exitTransition = fadeOutTransition, - ) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + state.emotionTypeUiModels.forEach { emotion -> + EmotionMarbleImage( + modifier = Modifier.size(40.dp), + image = emotion.image, + alpha = if (emotion.emotionType == currentItem.emotionType) 1f else 0.3f, + ) + } + } - Spacer(modifier = Modifier.height(16.dp)) + Spacer(modifier = Modifier.height(26.dp)) - Box( - modifier = Modifier.weight(1f), - ) { - EmotionPager( - modifier = Modifier - .fillMaxSize() - .padding(bottom = 90.dp) - .zIndex(1f), - emotions = emotions, - enabled = !state.isLoading, - onSelectEmotion = onSelectEmotion, - pagerState = pagerState, + EmotionDescriptionText( + emotion = currentItem, showText = showText, - marbleNameTextEnterTransition = fadeInTransition, - marbleNameTextExitTransition = fadeOutTransition, + enterTransition = fadeInTransition, + exitTransition = fadeOutTransition, ) - Column( - modifier = Modifier.align(Alignment.BottomCenter), - horizontalAlignment = Alignment.CenterHorizontally, + Spacer(modifier = Modifier.height(16.dp)) + + Box( + modifier = Modifier.weight(1f), ) { - GestureDescriptionText( - currentEmotionSelectable = currentItem.selectable, + EmotionPager( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 90.dp) + .zIndex(1f), + emotions = emotions, + enabled = !state.isLoading, + onSelectEmotion = onSelectEmotion, + pagerState = pagerState, + showText = showText, + marbleNameTextEnterTransition = fadeInTransition, + marbleNameTextExitTransition = fadeOutTransition, ) - Spacer(modifier = Modifier.height(12.dp)) + Column( + modifier = Modifier.align(Alignment.BottomCenter), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + GestureDescriptionText( + currentEmotionSelectable = currentItem.selectable, + ) + + Spacer(modifier = Modifier.height(12.dp)) + + Image( + painter = painterResource(R.drawable.img_pomo_hand), + contentScale = ContentScale.FillBounds, + contentDescription = null, + modifier = Modifier + .width(263.dp) + .height(192.dp), + ) + } Image( - painter = painterResource(R.drawable.img_pomo_hand), - contentScale = ContentScale.FillBounds, - contentDescription = null, + painter = painterResource(R.drawable.img_pomo_thumb), modifier = Modifier - .width(263.dp) - .height(192.dp), + .align(Alignment.BottomCenter) + .zIndex(3f) + .offset(x = (-20).dp, y = (-70).dp), + contentDescription = null, ) } + } - Image( - painter = painterResource(R.drawable.img_pomo_thumb), - modifier = Modifier - .align(Alignment.BottomCenter) - .zIndex(3f) - .offset(x = (-20).dp, y = (-70).dp), - contentDescription = null, - ) + AnimatedVisibility( + visible = state.showLoadingView, + enter = fadeIn(), + exit = ExitTransition.None, + ) { + EmotionLoadingView(emotion = currentItem) } } } @@ -441,6 +453,7 @@ private fun Preview() { isLoading = false, step = EmotionScreenStep.Emotion, recommendRoutines = listOf(), + showLoadingView = false, ), onClickPreviousButton = {}, onSelectEmotion = {}, diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionState.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionState.kt index 3e016ddb..b095935f 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionState.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionState.kt @@ -14,6 +14,7 @@ data class EmotionState( val isLoading: Boolean, val recommendRoutines: List, val step: EmotionScreenStep, + val showLoadingView: Boolean, ) : MviState { companion object { val Init = EmotionState( @@ -21,6 +22,7 @@ data class EmotionState( isLoading = true, recommendRoutines = emptyList(), step = EmotionScreenStep.Emotion, + showLoadingView = false, ) } From 1b08cab959db25f54ed44aae8cdc6aaead19a8a0 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Tue, 9 Sep 2025 21:42:11 +0900 Subject: [PATCH 09/12] =?UTF-8?q?FIX:=20=EA=B8=B0=EA=B8=B0=EC=9D=98=20?= =?UTF-8?q?=EB=86=92=EC=9D=B4=EA=B0=80=20600.dp=EB=A5=BC=20=EB=84=98?= =?UTF-8?q?=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0,?= =?UTF-8?q?=20=EA=B8=B0=EC=A1=B4=20=EA=B0=90=EC=A0=95=EA=B5=AC=EC=8A=AC=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=ED=99=94=EB=A9=B4=EC=9D=B4=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/common/dimension/PxToDp.kt | 3 ++ .../presentation/emotion/EmotionScreen.kt | 36 ++++++++++++++----- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt index 8654af5f..9ef3348d 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/common/dimension/PxToDp.kt @@ -5,3 +5,6 @@ import androidx.compose.ui.platform.LocalDensity @Composable fun Float.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() } + +@Composable +fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt index 105e8f14..c8e09327 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt @@ -1,14 +1,20 @@ package com.threegap.bitnagil.presentation.emotion import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import com.threegap.bitnagil.presentation.common.dimension.pxToDp import com.threegap.bitnagil.presentation.common.flow.collectAsEffect import com.threegap.bitnagil.presentation.common.toast.GlobalBitnagilToast import com.threegap.bitnagil.presentation.emotion.component.template.EmotionRecommendRoutineScreen +import com.threegap.bitnagil.presentation.emotion.component.template.SimpleEmotionSelectionScreen import com.threegap.bitnagil.presentation.emotion.component.template.SwipeEmotionSelectionScreen import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionSideEffect @@ -32,15 +38,27 @@ fun EmotionScreenContainer( } when (state.step) { - EmotionScreenStep.Emotion -> SwipeEmotionSelectionScreen( - state = state, - onClickPreviousButton = navigateToBack, - onSelectEmotion = remember { - { emotionType -> - viewModel.selectEmotion(emotionType = emotionType, minimumDelay = 1000) - } - }, - ) + EmotionScreenStep.Emotion -> BoxWithConstraints(modifier = Modifier.fillMaxWidth()) { + val height = constraints.maxHeight.pxToDp() + + if (height > 600.dp) { + SwipeEmotionSelectionScreen( + state = state, + onClickPreviousButton = navigateToBack, + onSelectEmotion = remember { + { emotionType -> + viewModel.selectEmotion(emotionType = emotionType, minimumDelay = 1000) + } + }, + ) + } else { + SimpleEmotionSelectionScreen( + state = state, + onClickPreviousButton = navigateToBack, + onClickEmotion = viewModel::selectEmotion, + ) + } + } EmotionScreenStep.RecommendRoutines -> EmotionRecommendRoutineScreen( state = state, onClickRoutine = viewModel::selectRecommendRoutine, From 15c5ba3c3b175549257104732bf532d334cf8d13 Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Wed, 10 Sep 2025 20:09:35 +0900 Subject: [PATCH 10/12] =?UTF-8?q?FIX:=20=EC=9D=BC=EB=B6=80=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=20=EC=88=98=EC=A0=95,=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EA=B0=80=20=EB=B0=98=EC=98=81=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8D=98=20=EB=AC=B8=EC=A0=9C=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/emotion/component/atom/EmotionMarbleImage.kt | 3 ++- .../component/template/EmotionRecommendRoutineScreen.kt | 2 +- .../presentation/emotion/model/EmotionImageUiModel.kt | 4 ++-- .../bitnagil/presentation/emotion/model/EmotionUiModel.kt | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt index dc82121c..3bf89cd4 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/atom/EmotionMarbleImage.kt @@ -25,7 +25,7 @@ fun EmotionMarbleImage( .crossfade(true) .build(), modifier = modifier, - contentDescription = null, + contentDescription = contentDescription, alpha = alpha, error = image.offlineBackupImageResourceId?.let { painterResource(it) }, ) @@ -35,6 +35,7 @@ fun EmotionMarbleImage( painter = painterResource(id = image.resourceId), contentDescription = contentDescription, modifier = modifier, + alpha = alpha, ) } } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt index d53a801e..359dc621 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt @@ -44,7 +44,7 @@ fun EmotionRecommendRoutineScreen( Spacer(modifier = Modifier.height(54.dp)) Text( - text = "오늘 감정에 따른\n루틴을 추천드릴께요!", + text = "오늘 감정에 따른\n루틴을 추천드릴게요!", color = BitnagilTheme.colors.navy500, style = BitnagilTheme.typography.title2Bold, ) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt index e387b3af..44d92fd9 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionImageUiModel.kt @@ -5,6 +5,6 @@ import kotlinx.parcelize.Parcelize @Parcelize sealed class EmotionImageUiModel : Parcelable { - class Url(val url: String, val offlineBackupImageResourceId: Int?) : EmotionImageUiModel() - class Resource(val resourceId: Int) : EmotionImageUiModel() + data class Url(val url: String, val offlineBackupImageResourceId: Int?) : EmotionImageUiModel() + data class Resource(val resourceId: Int) : EmotionImageUiModel() } diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt index 3e6ff51b..469eddff 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt @@ -42,7 +42,7 @@ data class EmotionUiModel( private fun getMessage(emotionType: String): String? { return when (emotionType) { - "CALM" -> "평온함은 마음이 고요하고 편안해\n균형을 이루는 상태에요" + "CALM" -> "평온함은 마음이 고요하고 편안해\n균형을 이루는 상태에요." "VITALITY" -> "활기참은 생기가 가득 차\n활발하고 적극적인 상태예요." "LETHARGY" -> "무기력함은 의욕이 없어 아무것도\n하기 힘든 상태예요." "ANXIETY" -> "불안함은 마음이 불안정하고 쉽게\n안심하기 어려운 상태예요." From 6aa82ac41959d18d8c444edad81be95e2c97cbcb Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Wed, 10 Sep 2025 20:34:50 +0900 Subject: [PATCH 11/12] =?UTF-8?q?FIX:=20EmotionUiModel=EB=82=B4=20?= =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=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 --- .../bitnagil/presentation/emotion/model/EmotionUiModel.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt index 469eddff..487e7275 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/EmotionUiModel.kt @@ -24,8 +24,8 @@ data class EmotionUiModel( offlineBackupImageResourceId = getOfflineBackupImageResourceId(emotion.emotionType), ), message = getMessage(emotion.emotionType), - symbolBackgroundColor = getSymbolBackgroundColorString(emotion.emotionType), - symbolColor = getSymbolColorString(emotion.emotionType), + symbolBackgroundColor = getSymbolBackgroundColor(emotion.emotionType), + symbolColor = getSymbolColor(emotion.emotionType), ) private fun getOfflineBackupImageResourceId(emotionType: String): Int? { @@ -52,7 +52,7 @@ data class EmotionUiModel( } } - private fun getSymbolBackgroundColorString(emotionType: String): Long { + private fun getSymbolBackgroundColor(emotionType: String): Long { return when (emotionType) { "CALM" -> 0xFFEFECFF "VITALITY" -> 0xFFE9FAD0 @@ -64,7 +64,7 @@ data class EmotionUiModel( } } - private fun getSymbolColorString(emotionType: String): Long { + private fun getSymbolColor(emotionType: String): Long { return when (emotionType) { "CALM" -> 0xFF692BD0 "VITALITY" -> 0xFF609F00 From d69bd15c8c03c9730540d0850011f7c138e9120c Mon Sep 17 00:00:00 2001 From: yunsehwan Date: Fri, 12 Sep 2025 19:24:40 +0900 Subject: [PATCH 12/12] =?UTF-8?q?FIX:=20=EA=B0=90=EC=A0=95=EA=B5=AC?= =?UTF-8?q?=EC=8A=AC=20=EC=B6=94=EC=B2=9C=20=EB=A3=A8=ED=8B=B4=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=9D=BC=EB=B6=80=20=EB=AC=B8?= =?UTF-8?q?=EA=B5=AC=20=EB=B0=8F=20=EA=B8=80=EC=9E=90=20=EC=83=89=EC=83=81?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/template/EmotionRecommendRoutineScreen.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt index 359dc621..538383e3 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/EmotionRecommendRoutineScreen.kt @@ -44,17 +44,17 @@ fun EmotionRecommendRoutineScreen( Spacer(modifier = Modifier.height(54.dp)) Text( - text = "오늘 감정에 따른\n루틴을 추천드릴게요!", - color = BitnagilTheme.colors.navy500, + text = "오늘의 감정에 맞는 루틴을 준비했어요!", + color = BitnagilTheme.colors.coolGray10, style = BitnagilTheme.typography.title2Bold, ) Spacer(modifier = Modifier.height(10.dp)) Text( - text = "오늘 당신의 감정 상태에 맞춰 구성된 맞춤 루틴이에요.\n원하는 루틴을 선택해서 가볍게 시작해보세요.", + text = "오늘의 감정에 맞춰 준비된 맞춤 루틴이에요.\n원하는 루틴을 골라 가볍게 시작해 보세요.", color = BitnagilTheme.colors.coolGray50, - style = BitnagilTheme.typography.body2Medium, + style = BitnagilTheme.typography.body1Medium, ) Spacer(modifier = Modifier.height(28.dp))