From c74c847a8c854176f5e701cd59d927d36cc05fef Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 3 Jan 2026 17:50:22 +0900 Subject: [PATCH 01/12] =?UTF-8?q?fix:=20=EC=8A=A4=ED=94=8C=EB=9E=98?= =?UTF-8?q?=EC=8B=9C=ED=99=94=EB=A9=B4=20=EC=98=81=EC=83=81=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 --- app/build.gradle.kts | 3 ++ app/src/main/AndroidManifest.xml | 9 +++- .../java/com/apptive/japkor/SplashActivity.kt | 48 ++++++++++++++++++ .../japkor/widget/FullscreenVideoView.kt | 43 ++++++++++++++++ app/src/main/res/layout/activity_splash.xml | 13 +++++ app/src/main/res/raw/n_splash.mp4 | Bin 0 -> 389537 bytes app/src/main/res/values/themes.xml | 7 ++- 7 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/apptive/japkor/SplashActivity.kt create mode 100644 app/src/main/java/com/apptive/japkor/widget/FullscreenVideoView.kt create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/raw/n_splash.mp4 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c26475c..0d48ba7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,6 +52,9 @@ android { buildConfig = true compose = true } + androidResources { + noCompress += "mp4" + } } dependencies { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d47e8a1..5aa6877 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,16 +30,21 @@ + android:theme="@style/Theme.JapKor.Splash"> + diff --git a/app/src/main/java/com/apptive/japkor/SplashActivity.kt b/app/src/main/java/com/apptive/japkor/SplashActivity.kt new file mode 100644 index 0000000..72eaca0 --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/SplashActivity.kt @@ -0,0 +1,48 @@ +package com.apptive.japkor + +import android.content.Intent +import android.media.MediaPlayer +import android.net.Uri +import android.os.Bundle +import androidx.activity.ComponentActivity +import com.apptive.japkor.widget.FullscreenVideoView + +class SplashActivity : ComponentActivity() { + private var hasNavigated = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_splash) + + val videoView = findViewById(R.id.splashVideo) + val videoUri = Uri.parse("android.resource://${packageName}/${R.raw.n_splash}") + videoView.setVideoURI(videoUri) + videoView.setOnPreparedListener { mediaPlayer -> + videoView.updateVideoSize(mediaPlayer.videoWidth, mediaPlayer.videoHeight) + mediaPlayer.isLooping = false + mediaPlayer.setVideoScalingMode( + MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING + ) + videoView.start() + } + videoView.setOnCompletionListener { + videoView.stopPlayback() + navigateToMain() + } + videoView.setOnErrorListener { _, _, _ -> + navigateToMain() + true + } + } + + private fun navigateToMain() { + if (hasNavigated) return + hasNavigated = true + val intent = Intent(this, MainActivity::class.java) + intent.putExtras(this.intent) + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION) + startActivity(intent) + overridePendingTransition(0, 0) + finish() + } +} diff --git a/app/src/main/java/com/apptive/japkor/widget/FullscreenVideoView.kt b/app/src/main/java/com/apptive/japkor/widget/FullscreenVideoView.kt new file mode 100644 index 0000000..d08f861 --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/widget/FullscreenVideoView.kt @@ -0,0 +1,43 @@ +package com.apptive.japkor.widget + +import android.content.Context +import android.util.AttributeSet +import android.widget.VideoView + +class FullscreenVideoView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : VideoView(context, attrs, defStyleAttr) { + private var videoWidth = 0 + private var videoHeight = 0 + + fun updateVideoSize(width: Int, height: Int) { + if (width <= 0 || height <= 0) return + videoWidth = width + videoHeight = height + requestLayout() + invalidate() + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val viewWidth = MeasureSpec.getSize(widthMeasureSpec) + val viewHeight = MeasureSpec.getSize(heightMeasureSpec) + + if (videoWidth == 0 || videoHeight == 0 || viewWidth == 0 || viewHeight == 0) { + setMeasuredDimension(viewWidth, viewHeight) + return + } + + val viewRatio = viewWidth.toFloat() / viewHeight + val videoRatio = videoWidth.toFloat() / videoHeight + + if (videoRatio > viewRatio) { + val scaledWidth = (viewHeight * videoRatio).toInt() + setMeasuredDimension(scaledWidth, viewHeight) + } else { + val scaledHeight = (viewWidth / videoRatio).toInt() + setMeasuredDimension(viewWidth, scaledHeight) + } + } +} diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 0000000..8ea8fbb --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/raw/n_splash.mp4 b/app/src/main/res/raw/n_splash.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..64d7076f58894b46aaebe06832ff92defe0e81e6 GIT binary patch literal 389537 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%0Ac97T!aHRWYM-eRYS^x7fqi`uVo4PWp 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%0DHck4Ak@ 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�_1!@7^FobK{f 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 z z04zU%i60On04xoFuK#b%|G)o0qA+@L*2NCh4^&f}y>{{_&3@luck3)zM7zSA1;Ef6 z|F&mWCElAK97-nM^a&YrGG$2u>S___?3|uL1dSs(P^IV>%AECG_5*-7M!Dn+i}&%u7Fi}wUgHl2 zl4B1E!6N?SGFy^R;tHYb-!m68{^{#=sB4nfmOemfwW<7slu+dzQ z{6L=1Ahn9VsKxfcg;wC-qHvzAZ#9gs8x=={Wb|?^hza-ivAXLwul}7JnvPS4tVxCU z>aVXDhL-iuN~qAp$;#Xt#K?-p4q?S-!g(aN7}~#4c@p*cEEc6qp(jOXLtGFGCY8j< zE=Ne=SW*Z%g$S7k+wo}!@rFyv>%$McG^EQ?6N`U5_<^8M*Ql6K7`9^s_~;$LXO7;b zcZrKlYrIxBkVAYUQaRF~p}IMt8(BGa4{5CIKL;7x1@Ddm{y|J=Ice}(Zc4Z>=*$+| zn2BH?{C+LyZz8M8maC)O)Y)Vd6UicvP%6FRS{&GVs7WJnu2)HdXDgzkV{9maiwWrAlB>&K1)HMyQ>kGtXP z3btJG5SMMNH1H77RmEa1nCQr*O-{E>iE4SXIjNjB=G@e_>p=WNlw)uCICZ?$Ky^_n z2kfWl?bTG(*T=%TR{J*t6lo(Vm<)5<~IIg`CnJJa82=s-G3rKg+^o%t*qVn#Jx970D8I#O+ zTjE8m(CtuAZml;ZBY^>Nvj_8}GBI|f9MTJCd_Yi*MY4rMGy>ObAUu;p*8q$U=)rF9 zF=5FjMM?^FVT=JaSpW2VaG0P(%jCP75by$xV=w*`Yv!XCDCZ%%K~F48 zA2Y0L;{<9cbFkNlA$_rS^b4SrqsW2sb-;nTBtyvP!+{u9IGL)YQfrSDhP{Hm4P)NG zXW7vvzE|@0F3&3b$9i`fAg0J&aXgI}{xYrKJHttmy^+m-pY8yhowFQXXB=i`L{8zU zs#zaOX@o(frinW#x1&F`z&@8s>CRU7$=C6G)%FM^Su51}3>U6}`0%-&o@HoDDsKft z+F_!4xb{Pb`h@y89Tr{YnFH3Rh(Ljl$kD^wuFMDM45|uSuT|)MWX75ZEL~t5Svm5L zF-K4mIOGXR6tWYlzzMDLkx=VGu%gQq;9rEEhCkzY@wz1mfku@W=C2jRY4WwSiRWL& zPGdEwR;k5WESEATydpqg8rS6yZHK_0LCLS- zc$CM$ZPr{U2513;gkzsM1-k&m??+4XYwFhY*3hXka9kg+ zZLqAPoG-$utaFmxFLylMf>Ycli1GMOjxcM>31^Ac)u%V|a}r{$Z1q#O%Ir$=8G@*d zm-loA%CQ0ibk&BS!P{6nz%MibD2q6AAcf&0-#(XyCs-@#ugNOW6XQ{p9Jm{iE;P!g z#>BPVXZo+16y;hiBl`?;_mSlr=Cnp*7L<_tmgng6-Seo0ZZr?pf4r(M;kX_o-Zo{0 zNU%L@P{eE8RQiqc3#(lbtIb1}5J`6sEbr6#(KJ?f}lLm-* zL*l#D?uvmkIkjRW}5mw>3*tG5gi4EoTZ*Lib4~F{vZQ- zYS&75y!N)05};DWf0q|S5&Zs82XSU=Gf+AC3!6&>Lnu| zho#JHP!1ewh?9b~UBnzZ^z~_41p8Y_5>-f1wcAmiXW}ow%v%?RR^k{ky>bUw; z8EgKg9gf*k~}N%58KvDyP{w3ES{<;~K~*g^Dx^Ve9! zvBNnuP7Hch1VJBp5Nb*lIjxFfX9|(o6AhV#Dw&$eBe?Z4`OwhibRg={~;S!X0PfQLdbItFk&}8`Ag} zT*yf$`{Xkjm1cCgC?Rz$Ra$@!3TZR#8;FH^U^}TK0?eh_171g_+@TvoF4{@jd zHo+aFo_eQgBtTa*iYNWMb`8H2i%P}De^9(((4I;1` zGRQa`(o46pE)Wdu7`9f`F+p12$#U@V?QCO#ipCU>>C_Sjs*U7I6{>%jf43~&If%e4 zhthNdv{O26aMz+E4WAnG0HBMA_$LQQw*@@@A7TDGlC5&wKaG30!Bs*y=z z3?hWp4?SYy&O^vJIz8ki1mr9DdN_!OrnYo#gB7wWiayH7=zUgUzSR1SoQSl6In*Ru zl8NNE&S&yvXg9#bOr&HRDLxhiTTNG~5R*~lcstvPN8)TJc|51;Bl?aDY}R3_Jb%NiXJ9Z1|t0hUD=EBO)$-1IH~>XM6K$RU5nL zTp-+cNat?@ea=?8w~~?azdM&RcU&O*q+DQ+k0>qCcO+wIXR&j*i=rEI)y-ocknY=D zcN}07?fL+^Uh>dj&>d{*z~gU7eSnO+!^ISY<-sPhGGQ5N79cf8T7>B!oQiPD8MOUm zF5x1IfoC8Iixe0SGXV&vvK+i-`LhSS7bhU76?myPhA^I*jtp!+e|9EsFTh>A{764? zVA=vhT7lOgAq6+dknMOL}cBHuF8c1zuzixF5?lPpVG+o z36-mJcvFz9?PQCnaG!4GfBMe$o3zuE27r-QAJc|hw`P~mI9cL(;q#utt=rU|Gb_ZW zWkyna!xQ#=My6C1p(#`@1kWKatyqW=*+l3#v04i;#6zo<9lFO|t~(7Bcw0z=xFN>| zEWI4i$n+^SQ~*SKS;7fS%NmzskQ|!Jwgu*!V!OvKfuyF+6~PBB?H14dv`8>inN>gZ zi|xt;^{rAh6ty)OZwKJStTZM)5bdyJ!ZeQ(s3aWfuz=`m_Q%uoN79}**Dyh_4GoeM#)V0a?N)W^Hd4|4A5wR18_I0p&Qo$ySB=-`Y zklcHIG7^zoC&L^&DY{BsN1-2^UhHmFy#^VhWfy%i)osKwIaINnW<>{By(S+ov$>Y_ zxzBs=>Pc8Am>OsR$$R?fbNo7Bq6{5j0!Ffmgh=83Ci6yaAV+wKYavNjHSMifSkNTo z=2YIM#-hu<=C-aXtRGtn+&vok(=|qy%x3E%Fw%x^%2vUeNPzyA#cfNu%jzjBbf0?_ zqMGCsYrz&u8W=)qpHwBzYY7R8PSSS@ph6fl2_mxpsRG}4Fr zy_=)4d3%);VJnM##{;y6y+`G%h&-ekwc`{g14HVK>K5QzBGa${rmyOzs8Xo{x=43#aVaoH#ey8jm!u}%oH$lf~ci{0!QUz!}l91=RPTNj$eZE zs@(a0s$iwIF|MNrhD@zHqoif_Xu0A)Ih7TV*C$D)oYYmp?)EQISAT2}aNc6GjB7N1 zOOw>U&WjBH0h2y&ZRYYA&O+WMZubo5b@2j2YM7M~bv*s$(8X*WqbDf%iy0;d#>`ty zNT~(9*;qWJ?%vH7V3#+h)zn zLYL38#x#vS7Bg-W&zjf$&w9z$rua|M=5tHh?Ci83F(xf8O~NeY6cZm9PeG2jorJ)u z#;{D=+Nb`j(UoKOL_Z_(4omY@mBl3LpsB7+)o=O1iX7lTIe-y2rD^qC zB8)+}BjagSy(tN5<_5Z@DJ>c{dY!=FQU-^P8hVpN2`(eD)C?UtQv#a*6|@tm{;u#) z0m5KK)0p8&&bKX_g>c+*WT(A;Ja{tM3-_7=>SoI}1+(GM+f$$V{YU@pvA74G(;EkX z3F$#@+H<(Ct^8*G{)o=s{tUXYkdszYJAu^B{90DBdQF;Dl%%U;@&jyPkmoeZ=+M7R#T z?--q@Pakb~nemx*Sr9$$IDC3?I=d(d>h$NrFT1rl6BohkH9Z7ZMI-^}>#2{wBQWR= zVNJ5XGx}eLws4*IsHdzAJHY`4AZAMl)Om_zhGRQ+t}2`0iFJ`>X`2cvW%3;ck-OOz zu6_I$W2K_nA%j_5fLk;CXkveh4%GBR^>9;2M%kvs?px>stj zG$B=uEE7$CPU3$U2B%3qEqABeR6@W8K7iw;s+jROfM>@E{z0C|o*f7KgQ*674gVQU zKW3xrfr817v`gh^{W)kQqf}={mr6LpbHoT)_WDk^Q^H=Y8v*BCpQHnvH^|Qsj8a2| zm!EXISAQ~eGv>G{7<9=TPnH=lJ7DoF@Qa6?=!!s}xblYp=Py>m89Iw?Ag4uxH8ACBQrf&iB8rJz@CKPtkkiYa0gTV-U~+i^deygUK8gj4fE)p!5FtT z6X^+$)u%80(F z0uUTlm|v)uN#GP-@20Uo1YQ^k;H*}Xc$hPDOl~vDgDe+AVH0jq=yRknN; zES_!%{+yAUIizLfvo*l%XvQ}=C}tz@e%{VmmUu|*#sZg!%i9sf`f>Q9?I0*wLp7jx zK%yBg5NS;f%56joL6;l*cri!$F6#Tk@9-N?sbDu>?&s?$UkW1?=Jw4~ z2foZsWP2KyPW!>wI<0nW@g8HD@{I2390LxN?mwI1HmOw_vp24R+a6@5Zf^QGZxEN( zze{@jsS;jH^xIDGt1c9%JizxW^z-()6~$}M6&>xU&VeY<)Zo;wA4?B?H+4uLXuG-8 zuBR;PH5tt-1tY>}Yq|0Kk3#$Q}R@0AL0Hx&S~B{!b4)|DQaA z0XZ0rABLw9lD?n7f3|G93@y^p6CB8Wi?f3=xRg&F{FSAIKa1w89CW%EtT~nO zNwM}Ya;&2GGZmTD_s?YWV8G^SsE9(IUA3`-{?iUY2egm#(f~UL8bowY`%TVgZ(&u% zufnTt@7KFhh_xU4WC&(~l?_vxjw{-BvAEy&%t7P0lv;lkI zoz(S!k6%TsOD8Xv?KKVo<)`&<+UpgX9fjmV^G-?jEh3vqS+n~~)%xsuzfxi>Q-K3= z+|M6qnsFkAE|!2pgWAG!HVoglxykw6GWWI>uVwkadyK@v3`4Dpy>$fn6A$IW9Jfnr z_6^d7#M1#rBgEZotMPB#N|*dLGt+OH0^naU9o8seX1hfKA2dLSbwOnSI}VlW9Eg-a zu_-@OC7+GQ_T!s@k%UA1N2w6+-n7k$fd~uVvh_}_{7F$kl}L9*nQgGv^2qdQ!9)?> z`I|{dkwOUR*N#rJ}n0A=5x zT*+G^Yto4I-gm5*+jLPuEJ`eWbH#N6I#T(nDf0Ij5k$p?1hfXJ9BJPDz5K~!oS zAgpZf-W4#erU8|zaFCod&-VwI@YrlVv8bNmft#R6Izle*9r(p55_0kw5ljQBKrXu< zCZUXY`Xwz=ThzOp)mi;JaiGqA{95RG<8D;3Cqzkv4YZIT#pUNXGt$c_PX+jl4XdYR zYaOkUAuOf8(?KHBi?-yz>pjcAfi=l#C^EVu?i3XB6R6(4*Z~ei4@)JmSb1;6@|&gj zgZVD4FmkQ1uX}(!%(l1=y4Xt%H%ZhmcT7*LICukcj|z9}%W7Hy@;|4HC^ z`Tr+L`#*t-@c-EiVFXmM9wzqH@?y44L-ksb`7*}vNJR6f$TkWUcTmKzrJK|IN>pWK{Hapl1`+w3H?7^D!Ki4Er0LNI`-cT{ChLz z>3@;ZS6178MXes>%X$17~(I%7h3*XR{kco_w6sG z7j^w7D*sb&zQ5KT{Npc`n_>DZVl*R)|C)ECf931{tzgjl|Gxeg4CmqhH8To-4UT^K zm%4{Y{WW;=UxS>rY)PEHU|L&@4q`#znPUpX-$bZ0--}`q#|B?dVe?jJd7?Ei6 zm&AmD{palb56}vhw90>JS!4TOTDBlU`7c%er@e-+e@T0B`~RWKe+e&@zqBk8<1a0v zWBF^{4F0KGi%w&lAQYgflH14ll#g$7bl47X{9ZV1D;s=rdvu6YlZR|!z%)T!k~aoP z0=#4~*2W(b2f~FwOjS~r=W;rojxb%8Yy59Km=w<<_P79UZWkGnRniZo(2G=vFjD;WSIB6@lvqa5YHWi*ntt5E`kT}ObM3!NRj}mn_-90w z9i`D#+pJf$@|^AlV9pmL?aBQ;1PbV}9{%B1rQyMjQRS-74~=&~p$;ysU*|ufz-Id8 zpDuF%J)VZmlj=UM%;NdCVWU_72(;$ow|~aeZMILi2YoU!_4>aVSrD913;mB6Fy7Ao zhsca1O#XZs{E*7gR~|w|`WSSn$%KC-1Qz>o)!*T6x{V%bEvF@QP8fx-ogC(}y;1*x zHrmbeceH&w$X_p=(nN#Jqv(0joZl_v%rO2jTFdd{?_f$@h4k6ewc^_EBrbpFgFN&< zYrWUztzq{OeWjY#L_Cyd+*I1Qz4wnGZ{hp<9dHs`XW9sC4ql8?THkp0Z&;QTCjaEl z$*f9b_~!zNy*4i#EKts~;yfG|)ftcbOXOw^5kErF=;D7VGO> zJeePlW5q#S`0NX;C(hGP-(EB{)o<|9bFIvIf0F03BIB-3mIEff#lsv5QFCP)vl0&a z0rZ+P5$_Qdi`f!B$ATcZIXXCnIa0w0KEIL@Vja1id0KpU-CtNdF=L= zQu;iQBdce_9!nj64$H4x{|)3bSf^TJ@K|Xw20j?X;IoB0ACJlXipTsQq)bQ#ECuHMz5;}_^*q_PLUXra?NQ)(@wWvfROV)}* zs%JGXD=hn_VwZ}ac9B>IDIc*_vq_zBG!(en;Rr_vr(ziJ4v06AF}b|6ZnbQlXK&uK z4*1|0RKLhA#xIM%8jeY0UaJ-)~}_EBk(h0lpcO%bX6Bwm3H( z919H-)X<A{i+G0sa)35Fy zDYtGu(gdM!s%lJ*{F>245_noO0|VYt4mO~=Hft9?UU+y{_Y*H^j)hL2AJb3A_}2mE zxXoeYX2OQe8^k;tiRU@d-*P6m@js-+|7!2v`X_tR8NX#o1y|^>r{FM({;jW6?({`0t)ah2;4WsxDx1uFR=ht^5DYk0GtRC88GU)Z>P-rQXx zt$}6vkIf1-md$Z~IwQo%J#`6peFp+c4;2;09m&c$<{9EzecCDZ*FCl? zx4L}T`SzqoPImEPkyp-_l5Z+p9k(rV&_QW~v}Zg2oa3pm^OVKjp`|%9wa+{d9AX}} zMA?1!sf78Gthn%p9bLyZGMn2C3{!90XZbHJs`rT9s&r$HrQPI35lTNk5iOS*c{xa% zHB+?sYqt?*9#3P+Hs8LWC4BNjswSthIZ<)4mSeVM-VN5$1-^FWMH-%)gc6P#OLg>! z!{03YDL(zHD(+W4CJAqrb{H5@5*#F+b79-q3ri;GE%>#tQ2pic>@utK-WR@`o2tk? z)0ua6rIMPxZQVLq-RIB`@gnJWN zA}4t0gZYgODdH|67fpTUt{sOJPLP1j~Y-`7!uw$nv zyqk41_JX8KQJ$GNC&pLl81s>lo|@_Hp%sPW!`Y!{lj~fJI|s0iRuW22NUdSLxi{jQ zVPiBcGR4ahZpI{w8---wzWS(X(AXdOVJwT#jgs4RbN%9)TP$GykU`j`h!w99NckTJp#Jhr!F+Ye zhY7B8I)`Ie`iV=;uXqm+?_pgr?tkTf_Xz6Wao>pa)$VWSqiTzwcfwo!=Gh~+yzcd#pQ`J1w;9C(?4GMd@9ll<8+o^t@(ymi=(WQPS=V)ZdVGsVdtBPJFAaL% zt;>7ujkbX)y>5Dmc<-AY*!!lR=zY@-DLaa?GMC;reY;HWo37LQriW2l<6T+8UG9Up z%glPunR@8~n`g&Zw_ZG|^4xui!UlPt7bbdE(~Cs>D<`g=SoV71aaMEXJI~u!CXG>V zDYQ;>cUGQUQ&%yH`xOQ$ccMhd41IEd&A3N|cM(}-Vn!It+P%@@ixAH2-nPrn?QZvPZSl^ww>+VQW&F*@9ND&n`b!F zZla!$?$B@!^VVd&gcgC}J16gm883Qg_LI}XWNySB6J!0rvCHMRoeJ<~kC-lCB6%yz zcfO5-j)Rqi!J#luu~c~#)jf8B26KgeGB~XEZHDyk?uUj;{ShR}{aG~YtU%P#YD1xx zqgs)-?kWr{GuP1H{C3~o42vvFsWSp1k1N-z8&_^fU~h<(Dc|Jf5IJE+5j)9p#H~r+ z1>DQLk~}O|$5M2oRM4|!wE}J?*TxT*HZFD6k*^PRj%EDGLy zaeKi5i53f!Q0YNNP7=ln+pCs)Zp%{Eif*=r#3~!wHCU|*AI3S za67UpeZqs>^%}7$iv?rIWbf+_?RVc2w3ZD0YMsC)U!jdLd)`~@3BJ$JI=*(zsEZ3L z%v9f!SSzbhmskCgw8T{Hg}^Q55hK5EOJ`OmEnH>eFSLoH*j!$H=lE%TnZp@ZM_2n5 zd5*S_XAAi@tZ!u5EVJ8MwR&vSZ>{--VsYy%OUSD-4o5s8*)=Czyf4tlz6#Co$``H`iwb7p*x_JjFb(fRF{DrlS8& zr~ZVbv)oVS1O%83UY(NXtz5s=$nBSUUsI7M0cVvPvT9ac_8IZyrr-Cvt*axoRsD_h zBA&cjE%|W3?-h|p+MqI$h@b-z$t8o6$uvSziNGu(#wHpZlJ;4?<39N?@jw1f@35JY zmc&<|=rPYfGW=*(%oXBKR*`(dI*`h?-CnD1yYniGqZF5ji0zU<8SS z6Ma9tHBl340!5IhiPs4I5^6$Cpa>E*(f7k!6E&eGPy~rLPP|6=C?O~01dJe&6CZ$h zt0E`l1dJf@16*Dsv`dHyF##e-9GhtKp;kmr$O#xh;&TY961rv7gqlDRBo0n=^>nL; zoRAYRg2ch88xxufP!nnbMUbe8CZ2B9P!nnbMUbee8xxufP!nnbMUZ&oL=#WPA&G2W|aroZm><3;}cJ z)F%1IXBvKsH{-;&j82I7^W5`A_hm}03I^$?Ep5Ebo$W_>1CeMTO3Gw5hvXAM4V)w7 z6Em}XhVzt&yySKRA?6GA?ABe4QfIEUws^D#M_bK`vE5Xa^uS+2ZKUzf4hQqHZ!df? zX2P9aZ%!)L*iUvfwOiq|(R`Ol>$Cmpb!`)+*yxi>gki{?MV<`EB{IomA|ZK1z=24N zZ<{vezqemL!$Z}lnUM!&9p;H_8X94ez$8uR99#zDg?IYoEFN3Ur(z2Nu2 zp!K6>jLp^FXKq`(usmYqcTTc;@8SY|+K%!NOEN*9Sh7hhVWbkFl|+(5v^XT32;{eQ z1?&f({T^U&k0W67F+Wl8?pxwgB@rwCflJF_vMmO1LN;;2VWvPV=04_w~1UNJ8s$0lPqB$&+zCj%Cd z!GzebxpM*jhxbaKo`OHal@EHv?F9^G)2{YjkT|uq>S=2ec7iXf2e)+s;>3KtcXsPT zeHnw=o%#{>s^_K;NMiZUxh_`_^>|D3TgB-j7t?-OTsAHCWI@g=%}l8s8x-BlU!NG^ zFvELbSa#^?^adfrp`wP;e$0RTkJyjx?Ys%^pLUv~`lp?@v3=eSPNqbCT!Ifq@WBW? z5P`(Uj8r9b%cu!8fg(uML{|^B9%@2Opa_!oLwmf`Lr%blnmEy47pDi=G$wV%8J($? z!f=E}|yX1d1SWaH7qJS`j%RCtw6gcW`Q-2jJb2KL6c(dpj-h{nO6-%0Q1_qqGIlV)%ybP-h`tB6=GV<;KU5mF|p z-K(J|^aPF|ad7JHgw_(ogqQ#kB;GjDqSI3)q!coWvB@?fg(s8oao5uu?})VPQVBf2d5sX&{&9?P!lMEL`^i{^jHNop(aoS ziJE$(LSrFnLQS9u5^tPn!0EXPazakP2ogEBo%Kg*M<5B(7&Xdvo)6P?k{%NOfeE+ob*Q7pg2Y>WP9dB`P z#laN@RY<&6r7EFaMo!2H7(wE5N!olU6;Tsv0!5HGI8l($FCr)81dJeYaH8*rw#);PmA0_03oPZG|4o-Xk;;D+7P!lME z#KDP&2tNhngq(m8Bo0pe2>Q4#YC=t*2og1YEQFues0lTJB1pW{<3|urUF3wEfDt6k zZ^Gj@UwI^P3y29Z0U}78XOpUgei=QXCvXIbgA;u}JT(y$Vgf{vc;m!Fgr5R(LQcR4 z5})evBk1G0s0lTJB1jyZJ{H2)YvhESfDt6!!Kr=XiD&=o^B>N)w^Ki@&)dPrl+;rP zo*nS)0A~eAx@QN}gqlDPH8oogibH?;vJ*8?mC!BY*aWIj6P!cvMv$(aZuO88asoz> U$f+9>x(kpKasoz>G(V93KR?L_5C8xG literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 8882875..997a0fe 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -2,4 +2,9 @@ + From c62cd3b9e1747a7f2eecf14a008681df3b8e71b5 Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 3 Jan 2026 20:26:24 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20=ED=99=88=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apptive/japkor/LoginCallbackActivity.kt | 2 +- .../apptive/japkor/navigation/AppNavHost.kt | 6 ++ .../com/apptive/japkor/ui/home/HomeScreen.kt | 102 ++++++++++++++++++ .../apptive/japkor/ui/login/LoginScreen.kt | 4 +- 4 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt diff --git a/app/src/main/java/com/apptive/japkor/LoginCallbackActivity.kt b/app/src/main/java/com/apptive/japkor/LoginCallbackActivity.kt index c5aa01c..823d890 100644 --- a/app/src/main/java/com/apptive/japkor/LoginCallbackActivity.kt +++ b/app/src/main/java/com/apptive/japkor/LoginCallbackActivity.kt @@ -81,9 +81,9 @@ class LoginCallbackActivity : ComponentActivity() { val startRoute = when (userStatus) { UserStatus.INCOMPLETE_PROFILE -> Screen.RequiredInfo.route + UserStatus.CONNECTING -> Screen.Home.route UserStatus.PENDING_APPROVAL, UserStatus.APPROVED, - UserStatus.CONNECTING, UserStatus.CONNECTED, UserStatus.BLACKLISTED -> Screen.RequiredInfoComplete.route null -> when (needsProfileCompletion) { diff --git a/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt b/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt index 9e7cb43..448245b 100644 --- a/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt +++ b/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable +import com.apptive.japkor.ui.home.HomeScreen import com.apptive.japkor.ui.language.LanguageScreen import com.apptive.japkor.ui.login.LoginScreen import com.apptive.japkor.ui.requiredinfo.RequiredInfoCompleteScreen @@ -15,6 +16,8 @@ sealed class Screen(val route: String) { object Language : Screen("language") + object Home : Screen("home") + object RequiredInfo : Screen("requiredinfo") object RequiredInfoComplete : Screen("requiredinfo_complete") @@ -38,6 +41,9 @@ fun AppNavHost( composable(Screen.Login.route) { LoginScreen(navController) } + composable(Screen.Home.route) { + HomeScreen(navController) + } composable(Screen.RequiredInfo.route) { RequiredInfoScreen(navController) } diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt new file mode 100644 index 0000000..16b2727 --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt @@ -0,0 +1,102 @@ +package com.apptive.japkor.ui.home + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.navigation.NavController +import com.apptive.japkor.ui.components.CustomText +import com.apptive.japkor.ui.components.CustomTextType +import com.apptive.japkor.ui.theme.CustomColor + +private data class HomeTab( + val label: String, + val icon: androidx.compose.ui.graphics.vector.ImageVector +) + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun HomeScreen(navController: NavController) { + var selectedIndex by remember { mutableIntStateOf(1) } + val tabs = listOf( + HomeTab("채팅", Icons.Filled.Email), + HomeTab("홈", Icons.Filled.Home), + HomeTab("내정보", Icons.Filled.Person) + ) + + Scaffold( + containerColor = CustomColor.white, + topBar = { + TopAppBar( + title = {}, + actions = { + IconButton(onClick = { }) { + Icon( + imageVector = Icons.Filled.Settings, + contentDescription = "설정" + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = CustomColor.white + ) + ) + }, + bottomBar = { + NavigationBar( + containerColor = CustomColor.white + ) { + tabs.forEachIndexed { index, tab -> + NavigationBarItem( + selected = selectedIndex == index, + onClick = { selectedIndex = index }, + icon = { + Icon( + imageVector = tab.icon, + contentDescription = tab.label + ) + }, + label = { + CustomText( + text = tab.label, + type = CustomTextType.label + ) + } + ) + } + } + } + ) { innerPadding -> + Box( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding), + contentAlignment = Alignment.Center + ) { + CustomText( + text = "매칭 진행 중입니다..", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } + } +} diff --git a/app/src/main/java/com/apptive/japkor/ui/login/LoginScreen.kt b/app/src/main/java/com/apptive/japkor/ui/login/LoginScreen.kt index 7063af7..222a477 100644 --- a/app/src/main/java/com/apptive/japkor/ui/login/LoginScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/login/LoginScreen.kt @@ -214,9 +214,11 @@ fun LoginScreen(navController: NavController,viewModel: LoginScreenViewModel = v UserStatus.INCOMPLETE_PROFILE -> { navController.navigate(Screen.RequiredInfo.route) } + UserStatus.CONNECTING -> { + navController.navigate(Screen.Home.route) + } UserStatus.PENDING_APPROVAL, UserStatus.APPROVED, - UserStatus.CONNECTING, UserStatus.CONNECTED, UserStatus.BLACKLISTED -> { navController.navigate(Screen.RequiredInfoComplete.route) From a15a442823f6ed4eee3b2afb6a856949dfa1f32d Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 3 Jan 2026 20:43:51 +0900 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=EC=8B=A0=ED=86=A0=20=EC=A2=85?= =?UTF-8?q?=EA=B5=90=20=EB=A7=A4=ED=95=91=20=EC=97=90=EB=9F=AC=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apptive/japkor/utils/required_info/RequiredInfoMapper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/apptive/japkor/utils/required_info/RequiredInfoMapper.kt b/app/src/main/java/com/apptive/japkor/utils/required_info/RequiredInfoMapper.kt index 47a8671..c325ad7 100644 --- a/app/src/main/java/com/apptive/japkor/utils/required_info/RequiredInfoMapper.kt +++ b/app/src/main/java/com/apptive/japkor/utils/required_info/RequiredInfoMapper.kt @@ -42,7 +42,7 @@ object RequiredInfoMapper { "불교" -> "BUDDHISM" "기독교" -> "CHRISTIANITY" "천주교" -> "CATHOLICISM" - "신토" -> "SHINTO" + "신토" -> "TOISM" "기타" -> "OTHER" else -> null } From 4fe6e0a3526291eacd64a5fa4679edb98eb75c3c Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 3 Jan 2026 20:44:51 +0900 Subject: [PATCH 04/12] =?UTF-8?q?feat:=20=ED=99=88=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/apptive/japkor/ui/home/HomeScreen.kt | 29 +++++++++++-------- app/src/main/res/drawable/ic_chat.xml | 13 +++++++++ app/src/main/res/drawable/ic_n.xml | 16 ++++++++++ app/src/main/res/drawable/ic_settings.xml | 20 +++++++++++++ app/src/main/res/drawable/ic_user.xml | 10 +++++++ 5 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable/ic_chat.xml create mode 100644 app/src/main/res/drawable/ic_n.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/drawable/ic_user.xml diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt index 16b2727..5bbb457 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt @@ -3,16 +3,12 @@ package com.apptive.japkor.ui.home import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Email -import androidx.compose.material.icons.filled.Home -import androidx.compose.material.icons.filled.Person -import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Scaffold import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults @@ -23,14 +19,16 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.navigation.NavController +import com.apptive.japkor.R import com.apptive.japkor.ui.components.CustomText import com.apptive.japkor.ui.components.CustomTextType import com.apptive.japkor.ui.theme.CustomColor private data class HomeTab( val label: String, - val icon: androidx.compose.ui.graphics.vector.ImageVector + val iconResId: Int ) @Composable @@ -38,9 +36,9 @@ private data class HomeTab( fun HomeScreen(navController: NavController) { var selectedIndex by remember { mutableIntStateOf(1) } val tabs = listOf( - HomeTab("채팅", Icons.Filled.Email), - HomeTab("홈", Icons.Filled.Home), - HomeTab("내정보", Icons.Filled.Person) + HomeTab("채팅", R.drawable.ic_chat), + HomeTab("홈", R.drawable.ic_n), + HomeTab("내정보", R.drawable.ic_user) ) Scaffold( @@ -51,7 +49,7 @@ fun HomeScreen(navController: NavController) { actions = { IconButton(onClick = { }) { Icon( - imageVector = Icons.Filled.Settings, + painter = painterResource(R.drawable.ic_settings), contentDescription = "설정" ) } @@ -71,7 +69,7 @@ fun HomeScreen(navController: NavController) { onClick = { selectedIndex = index }, icon = { Icon( - imageVector = tab.icon, + painter = painterResource(tab.iconResId), contentDescription = tab.label ) }, @@ -80,7 +78,14 @@ fun HomeScreen(navController: NavController) { text = tab.label, type = CustomTextType.label ) - } + }, + colors = NavigationBarItemDefaults.colors( + selectedIconColor = CustomColor.primary600, + selectedTextColor = CustomColor.primary600, + unselectedIconColor = CustomColor.gray400, + unselectedTextColor = CustomColor.gray400, + indicatorColor = CustomColor.white + ) ) } } diff --git a/app/src/main/res/drawable/ic_chat.xml b/app/src/main/res/drawable/ic_chat.xml new file mode 100644 index 0000000..9141302 --- /dev/null +++ b/app/src/main/res/drawable/ic_chat.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/ic_n.xml b/app/src/main/res/drawable/ic_n.xml new file mode 100644 index 0000000..9990e1c --- /dev/null +++ b/app/src/main/res/drawable/ic_n.xml @@ -0,0 +1,16 @@ + + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b0e49e1 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_user.xml b/app/src/main/res/drawable/ic_user.xml new file mode 100644 index 0000000..afa155f --- /dev/null +++ b/app/src/main/res/drawable/ic_user.xml @@ -0,0 +1,10 @@ + + + From bc88bc44e187c15ee8538a520230bfec832c2ce1 Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 3 Jan 2026 20:52:22 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=EB=A7=A4=EC=B9=AD=EB=90=9C=20?= =?UTF-8?q?=EB=82=A8=EC=84=B1=20=EC=A1=B0=ED=9A=8C=20api=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 --- .../com/apptive/japkor/data/api/MatchingService.kt | 10 ++++++++++ .../com/apptive/japkor/data/api/ServiceFactory.kt | 6 +++++- .../java/com/apptive/japkor/data/model/Matching.kt | 13 +++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt create mode 100644 app/src/main/java/com/apptive/japkor/data/model/Matching.kt diff --git a/app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt b/app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt new file mode 100644 index 0000000..c02bfce --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt @@ -0,0 +1,10 @@ +package com.apptive.japkor.data.api + +import com.apptive.japkor.data.model.MatchingResponse +import retrofit2.Call +import retrofit2.http.GET + +interface MatchingService { + @GET("members/matchings/female") + fun getFemaleMatchings(): Call> +} diff --git a/app/src/main/java/com/apptive/japkor/data/api/ServiceFactory.kt b/app/src/main/java/com/apptive/japkor/data/api/ServiceFactory.kt index 5abddce..552d5c7 100644 --- a/app/src/main/java/com/apptive/japkor/data/api/ServiceFactory.kt +++ b/app/src/main/java/com/apptive/japkor/data/api/ServiceFactory.kt @@ -8,4 +8,8 @@ object ServiceFactory { val requiredInfoApiService: RequiredInfoApiService by lazy { ApiClient.retrofit.create(RequiredInfoApiService::class.java) } -} \ No newline at end of file + + val matchingService: MatchingService by lazy { + ApiClient.retrofit.create(MatchingService::class.java) + } +} diff --git a/app/src/main/java/com/apptive/japkor/data/model/Matching.kt b/app/src/main/java/com/apptive/japkor/data/model/Matching.kt new file mode 100644 index 0000000..5153742 --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/data/model/Matching.kt @@ -0,0 +1,13 @@ +package com.apptive.japkor.data.model + +data class MatchingResponse( + val matchingId: Long, + val maleMemberId: Long, + val maleName: String, + val maleEmail: String, + val height: Int?, + val weight: Int?, + val residenceArea: String?, + val matchingOrder: Int, + val status: String +) From 7130e5e3459c4c3aec6c0a8bc6e10502f57d9171 Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 3 Jan 2026 20:55:30 +0900 Subject: [PATCH 06/12] =?UTF-8?q?feat:=20=EB=A7=A4=EC=B9=AD=20=EB=82=A8?= =?UTF-8?q?=EC=84=B1=20=EC=84=A0=ED=83=9D=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/apptive/japkor/data/api/MatchingService.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt b/app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt index c02bfce..56fc795 100644 --- a/app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt +++ b/app/src/main/java/com/apptive/japkor/data/api/MatchingService.kt @@ -3,8 +3,13 @@ package com.apptive.japkor.data.api import com.apptive.japkor.data.model.MatchingResponse import retrofit2.Call import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Path interface MatchingService { @GET("members/matchings/female") fun getFemaleMatchings(): Call> + + @POST("members/matchings/{matchingId}/select") + fun selectMatching(@Path("matchingId") matchingId: Long): Call } From ae29cae8f82f1fbcd1fcdbdafad6acb19d8b5716 Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 3 Jan 2026 21:38:34 +0900 Subject: [PATCH 07/12] =?UTF-8?q?feat:=20=EC=97=AC=EC=84=B1=20api=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/apptive/japkor/ui/home/HomeScreen.kt | 402 +++++++++++++++++- .../apptive/japkor/ui/home/HomeViewModel.kt | 109 +++++ 2 files changed, 507 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/apptive/japkor/ui/home/HomeViewModel.kt diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt index 5bbb457..451a1ce 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt @@ -1,8 +1,30 @@ package com.apptive.japkor.ui.home +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.ExperimentalFoundationApi +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.PaddingValues +import androidx.compose.foundation.layout.Row +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.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -13,18 +35,32 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember 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.graphicsLayer import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.lerp +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import com.apptive.japkor.R +import com.apptive.japkor.data.model.MatchingResponse import com.apptive.japkor.ui.components.CustomText import com.apptive.japkor.ui.components.CustomTextType +import com.apptive.japkor.ui.components.LoadingDialog +import com.apptive.japkor.ui.components.LocalToastManager +import com.apptive.japkor.ui.components.ToastType import com.apptive.japkor.ui.theme.CustomColor +import kotlin.math.absoluteValue +import kotlinx.coroutines.flow.collectLatest private data class HomeTab( val label: String, @@ -32,14 +68,50 @@ private data class HomeTab( ) @Composable -@OptIn(ExperimentalMaterial3Api::class) -fun HomeScreen(navController: NavController) { +@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) +fun HomeScreen( + navController: NavController, + viewModel: HomeViewModel = viewModel() +) { var selectedIndex by remember { mutableIntStateOf(1) } val tabs = listOf( HomeTab("채팅", R.drawable.ic_chat), HomeTab("홈", R.drawable.ic_n), HomeTab("내정보", R.drawable.ic_user) ) + val toastManager = LocalToastManager.current + val uiState by viewModel.uiState.collectAsState() + val matchings = uiState.matchings + val selectedMatching = uiState.selectedMatching + val pagerState = rememberPagerState(pageCount = { matchings.size }) + + BackHandler(enabled = selectedMatching != null) { + viewModel.hideDetails() + } + + LaunchedEffect(Unit) { + viewModel.events.collectLatest { event -> + when (event) { + is HomeUiEvent.ShowToast -> { + when (event.type) { + ToastType.INFO -> toastManager.info(event.message) + ToastType.SUCCESS -> toastManager.success(event.message) + ToastType.ERROR -> toastManager.error(event.message) + } + } + } + } + } + + LaunchedEffect(matchings.size) { + if (matchings.isNotEmpty() && pagerState.currentPage >= matchings.size) { + pagerState.scrollToPage(0) + } + } + + if (uiState.isLoading) { + LoadingDialog() + } Scaffold( containerColor = CustomColor.white, @@ -94,14 +166,336 @@ fun HomeScreen(navController: NavController) { Box( modifier = Modifier .fillMaxSize() - .padding(innerPadding), + .padding(innerPadding) + ) { + when { + selectedMatching != null -> { + MatchingDetailContent( + matching = selectedMatching, + onConfirm = { viewModel.selectMatching(selectedMatching.matchingId) } + ) + } + uiState.isWaiting || matchings.isEmpty() -> { + WaitingContent(modifier = Modifier.fillMaxSize()) + } + else -> { + MatchingCarouselContent( + matchings = matchings, + pagerState = pagerState, + onShowDetails = { viewModel.showDetails(it) }, + onNoMatch = { viewModel.noMatchSelected() } + ) + } + } + } + } +} + +@Composable +private fun WaitingContent(modifier: Modifier = Modifier) { + Box( + modifier = modifier, + contentAlignment = Alignment.Center + ) { + CustomText( + text = "매칭 진행 중입니다..", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } +} + +@Composable +@OptIn(ExperimentalFoundationApi::class) +private fun MatchingCarouselContent( + matchings: List, + pagerState: PagerState, + onShowDetails: (MatchingResponse) -> Unit, + onNoMatch: () -> Unit +) { + val currentMatching = matchings.getOrNull(pagerState.currentPage) + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 24.dp, vertical = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + CustomText( + text = "매칭된 남성", + type = CustomTextType.title, + color = CustomColor.black + ) + Spacer(modifier = Modifier.height(20.dp)) + HorizontalPager( + state = pagerState, + contentPadding = PaddingValues(horizontal = 32.dp), + pageSpacing = 16.dp, + modifier = Modifier + .fillMaxWidth() + .height(360.dp) + ) { page -> + val matching = matchings[page] + val pageOffset = ( + (pagerState.currentPage - page) + pagerState.currentPageOffsetFraction + ).absoluteValue + val scale = lerp(0.92f, 1f, 1f - pageOffset.coerceIn(0f, 1f)) + + MatchingCard( + matching = matching, + modifier = Modifier + .fillMaxSize() + .graphicsLayer { + scaleX = scale + scaleY = scale + } + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + PagerIndicator( + total = matchings.size, + current = pagerState.currentPage + ) + + Spacer(modifier = Modifier.weight(1f)) + + Button( + onClick = { currentMatching?.let { onShowDetails(it) } }, + enabled = currentMatching != null, + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = CustomColor.primary600, + disabledContainerColor = CustomColor.primary300 + ), + shape = RoundedCornerShape(16.dp) + ) { + CustomText( + text = "이 분 프로필이 궁금해요", + type = CustomTextType.body, + color = Color.White + ) + } + Spacer(modifier = Modifier.height(12.dp)) + Button( + onClick = onNoMatch, + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = CustomColor.gray100 + ), + shape = RoundedCornerShape(16.dp) + ) { + CustomText( + text = "마음에 드는 상대가 없어요", + type = CustomTextType.body, + color = CustomColor.black + ) + } + } +} + +@Composable +private fun MatchingCard( + matching: MatchingResponse, + modifier: Modifier = Modifier +) { + Card( + modifier = modifier, + shape = RoundedCornerShape(24.dp), + colors = CardDefaults.cardColors(containerColor = CustomColor.gray100) + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Box( + modifier = Modifier + .size(160.dp) + .background(CustomColor.primary100, CircleShape), + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource(R.drawable.ic_user), + contentDescription = "프로필 이미지", + tint = CustomColor.primary600, + modifier = Modifier.size(72.dp) + ) + } + Spacer(modifier = Modifier.height(24.dp)) + CustomText( + text = matching.maleName, + type = CustomTextType.headline, + color = CustomColor.black, + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(8.dp)) + CustomText( + text = "프로필을 확인해보세요", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } + } +} + +@Composable +private fun PagerIndicator(total: Int, current: Int) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + repeat(total) { index -> + val color = if (index == current) CustomColor.primary600 else CustomColor.gray200 + Box( + modifier = Modifier + .size(8.dp) + .background(color, CircleShape) + ) + if (index != total - 1) { + Spacer(modifier = Modifier.width(6.dp)) + } + } + } +} + +@Composable +private fun MatchingDetailContent( + matching: MatchingResponse, + onConfirm: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 24.dp, vertical = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + LazyColumn( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + item { + ProfileHeader(matching = matching) + } + item { + DetailCard(matching = matching) + } + } + Button( + onClick = onConfirm, + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = CustomColor.primary600 + ), + shape = RoundedCornerShape(16.dp) + ) { + CustomText( + text = "마음에 들어요 매칭해주세요", + type = CustomTextType.body, + color = Color.White + ) + } + } +} + +@Composable +private fun ProfileHeader(matching: MatchingResponse) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .size(72.dp) + .background(CustomColor.primary100, CircleShape), contentAlignment = Alignment.Center ) { + Icon( + painter = painterResource(R.drawable.ic_user), + contentDescription = "프로필 이미지", + tint = CustomColor.primary600, + modifier = Modifier.size(36.dp) + ) + } + Spacer(modifier = Modifier.width(16.dp)) + Column { CustomText( - text = "매칭 진행 중입니다..", + text = matching.maleName, + type = CustomTextType.headline, + color = CustomColor.black + ) + CustomText( + text = matching.maleEmail, type = CustomTextType.body, color = CustomColor.gray400 ) } } } + +@Composable +private fun DetailCard(matching: MatchingResponse) { + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(20.dp), + colors = CardDefaults.cardColors(containerColor = CustomColor.gray100) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + CustomText( + text = "상세 정보", + type = CustomTextType.title, + color = CustomColor.black + ) + DetailItem(label = "매칭 ID", value = matching.matchingId.toString()) + DetailItem(label = "남성 회원 ID", value = matching.maleMemberId.toString()) + DetailItem(label = "이름", value = matching.maleName) + DetailItem(label = "이메일", value = matching.maleEmail) + DetailItem(label = "키", value = formatHeight(matching.height)) + DetailItem(label = "몸무게", value = formatWeight(matching.weight)) + DetailItem(label = "거주지역", value = formatText(matching.residenceArea)) + DetailItem(label = "매칭 순서", value = matching.matchingOrder.toString()) + DetailItem(label = "상태", value = matching.status) + } + } +} + +@Composable +private fun DetailItem(label: String, value: String) { + Column(modifier = Modifier.fillMaxWidth()) { + CustomText( + text = label, + type = CustomTextType.label, + color = CustomColor.gray400 + ) + CustomText( + text = value, + type = CustomTextType.body, + color = CustomColor.black + ) + } +} + +private fun formatHeight(value: Int?): String { + return value?.let { "${it}cm" } ?: "미입력" +} + +private fun formatWeight(value: Int?): String { + return value?.let { "${it}kg" } ?: "미입력" +} + +private fun formatText(value: String?): String { + return value?.takeIf { it.isNotBlank() } ?: "미입력" +} diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeViewModel.kt b/app/src/main/java/com/apptive/japkor/ui/home/HomeViewModel.kt new file mode 100644 index 0000000..f4f8d6a --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/ui/home/HomeViewModel.kt @@ -0,0 +1,109 @@ +package com.apptive.japkor.ui.home + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.apptive.japkor.data.api.MatchingService +import com.apptive.japkor.data.api.ServiceFactory +import com.apptive.japkor.data.model.MatchingResponse +import com.apptive.japkor.ui.components.ToastType +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import retrofit2.awaitResponse + +sealed class HomeUiEvent { + data class ShowToast(val message: String, val type: ToastType = ToastType.ERROR) : HomeUiEvent() +} + +data class HomeUiState( + val isLoading: Boolean = false, + val matchings: List = emptyList(), + val selectedMatching: MatchingResponse? = null, + val isWaiting: Boolean = false +) + +class HomeViewModel( + private val matchingService: MatchingService = ServiceFactory.matchingService +) : ViewModel() { + + private val _uiState = MutableStateFlow(HomeUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + private val _events = MutableSharedFlow(extraBufferCapacity = 1) + val events: SharedFlow = _events.asSharedFlow() + + init { + fetchFemaleMatchings() + } + + fun fetchFemaleMatchings() { + if (_uiState.value.isWaiting) return + + viewModelScope.launch { + _uiState.update { it.copy(isLoading = true) } + runCatching { + matchingService.getFemaleMatchings().awaitResponse() + }.onSuccess { response -> + Log.d(TAG, "getFemaleMatchings success=${response.isSuccessful} code=${response.code()}") + if (response.isSuccessful) { + val data = response.body().orEmpty() + if (data.isEmpty()) { + _uiState.value = HomeUiState(isWaiting = true) + } else { + _uiState.value = HomeUiState(matchings = data) + } + } else { + _uiState.value = HomeUiState(isWaiting = true) + _events.tryEmit(HomeUiEvent.ShowToast("매칭 목록을 불러오지 못했습니다.")) + } + }.onFailure { throwable -> + Log.e(TAG, "getFemaleMatchings failed", throwable) + _uiState.value = HomeUiState(isWaiting = true) + _events.tryEmit(HomeUiEvent.ShowToast("네트워크 오류로 매칭을 불러올 수 없습니다.")) + } + } + } + + fun showDetails(matching: MatchingResponse) { + _uiState.update { it.copy(selectedMatching = matching) } + } + + fun hideDetails() { + _uiState.update { it.copy(selectedMatching = null) } + } + + fun selectMatching(matchingId: Long) { + viewModelScope.launch { + _uiState.update { it.copy(isLoading = true) } + runCatching { + matchingService.selectMatching(matchingId).awaitResponse() + }.onSuccess { response -> + Log.d(TAG, "selectMatching success=${response.isSuccessful} code=${response.code()}") + if (response.isSuccessful) { + _uiState.value = HomeUiState(isWaiting = true) + } else { + _uiState.update { it.copy(isLoading = false) } + _events.tryEmit(HomeUiEvent.ShowToast("매칭 선택에 실패했습니다.")) + } + }.onFailure { throwable -> + Log.e(TAG, "selectMatching failed", throwable) + _uiState.update { it.copy(isLoading = false) } + _events.tryEmit(HomeUiEvent.ShowToast("네트워크 오류로 매칭을 선택할 수 없습니다.")) + } + } + } + + fun noMatchSelected() { + _uiState.value = HomeUiState(isWaiting = true) + } + + companion object { + private const val TAG = "HomeViewModel" + } +} From ae69488347fad367c8c28aa179369b3b87d09e62 Mon Sep 17 00:00:00 2001 From: mark Date: Sun, 4 Jan 2026 15:28:18 +0900 Subject: [PATCH 08/12] =?UTF-8?q?feat:=20=EA=B8=B0=EC=A1=B4=20=EC=8A=A4?= =?UTF-8?q?=ED=94=8C=EB=9E=98=EC=8B=9C=ED=99=94=EB=A9=B4=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/themes.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 997a0fe..7ebb500 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -6,5 +6,9 @@ From 843ac4a68ae921a1c9ad8fa91a1649c78c257282 Mon Sep 17 00:00:00 2001 From: mark Date: Sun, 4 Jan 2026 15:49:02 +0900 Subject: [PATCH 09/12] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20=EB=92=A4=EB=A1=9C?= =?UTF-8?q?=EA=B0=80=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../japkor/data/local/DataStoreManager.kt | 9 +++ .../com/apptive/japkor/ui/home/HomeScreen.kt | 75 ++++++++++++++++++- .../japkor/ui/localization/Localization.kt | 3 + 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/apptive/japkor/data/local/DataStoreManager.kt b/app/src/main/java/com/apptive/japkor/data/local/DataStoreManager.kt index 93901cf..3c78647 100644 --- a/app/src/main/java/com/apptive/japkor/data/local/DataStoreManager.kt +++ b/app/src/main/java/com/apptive/japkor/data/local/DataStoreManager.kt @@ -73,6 +73,15 @@ class DataStoreManager(private val context: Context) { } } + suspend fun clearUserInfo() { + context.dataStore.edit { prefs -> + prefs.remove(KEY_MEMBER_ID) + prefs.remove(KEY_NAME) + prefs.remove(KEY_TOKEN) + prefs.remove(KEY_STATUS) + } + } + suspend fun clear() { context.dataStore.edit { it.clear() } } diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt index 451a1ce..f72b6a3 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card @@ -32,6 +33,7 @@ import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Scaffold +import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable @@ -39,12 +41,15 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf +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.graphicsLayer +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -52,7 +57,10 @@ import androidx.compose.ui.util.lerp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import com.apptive.japkor.R +import com.apptive.japkor.data.local.DataStoreManager +import com.apptive.japkor.data.local.TokenProvider import com.apptive.japkor.data.model.MatchingResponse +import com.apptive.japkor.navigation.Screen import com.apptive.japkor.ui.components.CustomText import com.apptive.japkor.ui.components.CustomTextType import com.apptive.japkor.ui.components.LoadingDialog @@ -61,6 +69,7 @@ import com.apptive.japkor.ui.components.ToastType import com.apptive.japkor.ui.theme.CustomColor import kotlin.math.absoluteValue import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch private data class HomeTab( val label: String, @@ -79,11 +88,15 @@ fun HomeScreen( HomeTab("홈", R.drawable.ic_n), HomeTab("내정보", R.drawable.ic_user) ) + var showLogoutDialog by remember { mutableStateOf(false) } val toastManager = LocalToastManager.current val uiState by viewModel.uiState.collectAsState() val matchings = uiState.matchings val selectedMatching = uiState.selectedMatching val pagerState = rememberPagerState(pageCount = { matchings.size }) + val context = LocalContext.current + val dataStoreManager = remember { DataStoreManager(context) } + val coroutineScope = rememberCoroutineScope() BackHandler(enabled = selectedMatching != null) { viewModel.hideDetails() @@ -118,8 +131,18 @@ fun HomeScreen( topBar = { TopAppBar( title = {}, + navigationIcon = { + if (selectedMatching != null) { + IconButton(onClick = { viewModel.hideDetails() }) { + Icon( + painter = painterResource(R.drawable.ic_back), + contentDescription = "뒤로가기" + ) + } + } + }, actions = { - IconButton(onClick = { }) { + IconButton(onClick = { showLogoutDialog = true }) { Icon( painter = painterResource(R.drawable.ic_settings), contentDescription = "설정" @@ -189,6 +212,56 @@ fun HomeScreen( } } } + + if (showLogoutDialog) { + AlertDialog( + onDismissRequest = { showLogoutDialog = false }, + title = { + CustomText( + text = "로그아웃", + type = CustomTextType.title, + color = CustomColor.black + ) + }, + text = { + CustomText( + text = "정말 로그아웃 하시겠어요?", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + }, + confirmButton = { + TextButton( + onClick = { + showLogoutDialog = false + TokenProvider.clearToken() + coroutineScope.launch { + dataStoreManager.clearUserInfo() + } + navController.navigate(Screen.Login.route) { + popUpTo(navController.graph.startDestinationId) { inclusive = true } + launchSingleTop = true + } + } + ) { + CustomText( + text = "로그아웃", + type = CustomTextType.body, + color = CustomColor.primary600 + ) + } + }, + dismissButton = { + TextButton(onClick = { showLogoutDialog = false }) { + CustomText( + text = "취소", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } + } + ) + } } @Composable diff --git a/app/src/main/java/com/apptive/japkor/ui/localization/Localization.kt b/app/src/main/java/com/apptive/japkor/ui/localization/Localization.kt index 125f318..b804ef2 100644 --- a/app/src/main/java/com/apptive/japkor/ui/localization/Localization.kt +++ b/app/src/main/java/com/apptive/japkor/ui/localization/Localization.kt @@ -33,6 +33,9 @@ object AppLocalizer { "로그인 성공! 환영합니다." to "ログイン成功!ようこそ。", "로그인 실패! 이메일과 비밀번호를 확인해주세요." to "ログイン失敗。メールアドレスとパスワードを確認してください。", "로그인" to "ログイン", + "로그아웃" to "ログアウト", + "정말 로그아웃 하시겠어요?" to "本当にログアウトしますか?", + "취소" to "キャンセル", "아이디 찾기" to "IDを探す", "비밀번호 찾기" to "パスワードを探す", "회원가입" to "会員登録", From dea12f50c98e822a81d6abfdebc6664baafed86f Mon Sep 17 00:00:00 2001 From: mark Date: Sun, 4 Jan 2026 16:15:24 +0900 Subject: [PATCH 10/12] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85,=20?= =?UTF-8?q?=EB=82=B4=EC=A0=95=EB=B3=B4,=20=EC=84=A4=EC=A0=95=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/apptive/japkor/ui/home/HomeScreen.kt | 508 ++++-------------- .../japkor/ui/home/chat/ChattingScreen.kt | 24 + .../ui/home/components/HomeMainContent.kt | 388 +++++++++++++ .../japkor/ui/home/mypage/MypageScreen.kt | 24 + .../japkor/ui/home/setting/SettingScreen.kt | 46 ++ 5 files changed, 592 insertions(+), 398 deletions(-) create mode 100644 app/src/main/java/com/apptive/japkor/ui/home/chat/ChattingScreen.kt create mode 100644 app/src/main/java/com/apptive/japkor/ui/home/components/HomeMainContent.kt create mode 100644 app/src/main/java/com/apptive/japkor/ui/home/mypage/MypageScreen.kt create mode 100644 app/src/main/java/com/apptive/japkor/ui/home/setting/SettingScreen.kt diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt index f72b6a3..54e1a6b 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt @@ -2,30 +2,10 @@ package com.apptive.japkor.ui.home import androidx.activity.compose.BackHandler import androidx.compose.foundation.ExperimentalFoundationApi -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.PaddingValues -import androidx.compose.foundation.layout.Row -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.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -40,54 +20,68 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf 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.graphicsLayer import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import androidx.compose.ui.util.lerp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController import com.apptive.japkor.R import com.apptive.japkor.data.local.DataStoreManager import com.apptive.japkor.data.local.TokenProvider -import com.apptive.japkor.data.model.MatchingResponse import com.apptive.japkor.navigation.Screen import com.apptive.japkor.ui.components.CustomText import com.apptive.japkor.ui.components.CustomTextType import com.apptive.japkor.ui.components.LoadingDialog import com.apptive.japkor.ui.components.LocalToastManager import com.apptive.japkor.ui.components.ToastType +import com.apptive.japkor.ui.home.chat.ChattingScreen +import com.apptive.japkor.ui.home.components.HomeMainContent +import com.apptive.japkor.ui.home.mypage.MypageScreen +import com.apptive.japkor.ui.home.setting.SettingScreen import com.apptive.japkor.ui.theme.CustomColor -import kotlin.math.absoluteValue import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch private data class HomeTab( + val route: String, val label: String, val iconResId: Int ) +private object HomeRoute { + const val Chat = "home_chat" + const val Main = "home_main" + const val MyPage = "home_mypage" + const val Setting = "home_setting" +} + @Composable @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) fun HomeScreen( navController: NavController, viewModel: HomeViewModel = viewModel() ) { - var selectedIndex by remember { mutableIntStateOf(1) } + val homeNavController = rememberNavController() + val navBackStackEntry by homeNavController.currentBackStackEntryAsState() + val currentRoute = navBackStackEntry?.destination?.route ?: HomeRoute.Main + val isMainScreen = currentRoute == HomeRoute.Main + val isSettingScreen = currentRoute == HomeRoute.Setting + val showBottomBar = currentRoute in setOf(HomeRoute.Chat, HomeRoute.Main, HomeRoute.MyPage) val tabs = listOf( - HomeTab("채팅", R.drawable.ic_chat), - HomeTab("홈", R.drawable.ic_n), - HomeTab("내정보", R.drawable.ic_user) + HomeTab(route = HomeRoute.Chat, label = "채팅", iconResId = R.drawable.ic_chat), + HomeTab(route = HomeRoute.Main, label = "홈", iconResId = R.drawable.ic_n), + HomeTab(route = HomeRoute.MyPage, label = "내정보", iconResId = R.drawable.ic_user) ) + var showLogoutDialog by remember { mutableStateOf(false) } val toastManager = LocalToastManager.current val uiState by viewModel.uiState.collectAsState() @@ -98,7 +92,7 @@ fun HomeScreen( val dataStoreManager = remember { DataStoreManager(context) } val coroutineScope = rememberCoroutineScope() - BackHandler(enabled = selectedMatching != null) { + BackHandler(enabled = isMainScreen && selectedMatching != null) { viewModel.hideDetails() } @@ -132,21 +126,33 @@ fun HomeScreen( TopAppBar( title = {}, navigationIcon = { - if (selectedMatching != null) { - IconButton(onClick = { viewModel.hideDetails() }) { - Icon( - painter = painterResource(R.drawable.ic_back), - contentDescription = "뒤로가기" - ) + when { + isSettingScreen -> { + IconButton(onClick = { homeNavController.popBackStack() }) { + Icon( + painter = painterResource(R.drawable.ic_back), + contentDescription = "뒤로가기" + ) + } + } + isMainScreen && selectedMatching != null -> { + IconButton(onClick = { viewModel.hideDetails() }) { + Icon( + painter = painterResource(R.drawable.ic_back), + contentDescription = "뒤로가기" + ) + } } } }, actions = { - IconButton(onClick = { showLogoutDialog = true }) { - Icon( - painter = painterResource(R.drawable.ic_settings), - contentDescription = "설정" - ) + if (!isSettingScreen) { + IconButton(onClick = { homeNavController.navigate(HomeRoute.Setting) }) { + Icon( + painter = painterResource(R.drawable.ic_settings), + contentDescription = "설정" + ) + } } }, colors = TopAppBarDefaults.topAppBarColors( @@ -155,60 +161,75 @@ fun HomeScreen( ) }, bottomBar = { - NavigationBar( - containerColor = CustomColor.white - ) { - tabs.forEachIndexed { index, tab -> - NavigationBarItem( - selected = selectedIndex == index, - onClick = { selectedIndex = index }, - icon = { - Icon( - painter = painterResource(tab.iconResId), - contentDescription = tab.label - ) - }, - label = { - CustomText( - text = tab.label, - type = CustomTextType.label + if (showBottomBar) { + NavigationBar( + containerColor = CustomColor.white + ) { + tabs.forEach { tab -> + NavigationBarItem( + selected = currentRoute == tab.route, + onClick = { + homeNavController.navigate(tab.route) { + popUpTo(homeNavController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + }, + icon = { + Icon( + painter = painterResource(tab.iconResId), + contentDescription = tab.label + ) + }, + label = { + CustomText( + text = tab.label, + type = CustomTextType.label + ) + }, + colors = NavigationBarItemDefaults.colors( + selectedIconColor = CustomColor.primary600, + selectedTextColor = CustomColor.primary600, + unselectedIconColor = CustomColor.gray400, + unselectedTextColor = CustomColor.gray400, + indicatorColor = CustomColor.white ) - }, - colors = NavigationBarItemDefaults.colors( - selectedIconColor = CustomColor.primary600, - selectedTextColor = CustomColor.primary600, - unselectedIconColor = CustomColor.gray400, - unselectedTextColor = CustomColor.gray400, - indicatorColor = CustomColor.white ) - ) + } } } } ) { innerPadding -> - Box( + NavHost( + navController = homeNavController, + startDestination = HomeRoute.Main, modifier = Modifier .fillMaxSize() .padding(innerPadding) ) { - when { - selectedMatching != null -> { - MatchingDetailContent( - matching = selectedMatching, - onConfirm = { viewModel.selectMatching(selectedMatching.matchingId) } - ) - } - uiState.isWaiting || matchings.isEmpty() -> { - WaitingContent(modifier = Modifier.fillMaxSize()) - } - else -> { - MatchingCarouselContent( - matchings = matchings, - pagerState = pagerState, - onShowDetails = { viewModel.showDetails(it) }, - onNoMatch = { viewModel.noMatchSelected() } - ) - } + composable(HomeRoute.Chat) { + ChattingScreen() + } + composable(HomeRoute.Main) { + HomeMainContent( + uiState = uiState, + pagerState = pagerState, + onShowDetails = { viewModel.showDetails(it) }, + onNoMatch = { viewModel.noMatchSelected() }, + onConfirm = { viewModel.selectMatching(it) }, + modifier = Modifier.fillMaxSize() + ) + } + composable(HomeRoute.MyPage) { + MypageScreen() + } + composable(HomeRoute.Setting) { + SettingScreen( + onLogoutClick = { showLogoutDialog = true }, + modifier = Modifier.fillMaxSize() + ) } } } @@ -263,312 +284,3 @@ fun HomeScreen( ) } } - -@Composable -private fun WaitingContent(modifier: Modifier = Modifier) { - Box( - modifier = modifier, - contentAlignment = Alignment.Center - ) { - CustomText( - text = "매칭 진행 중입니다..", - type = CustomTextType.body, - color = CustomColor.gray400 - ) - } -} - -@Composable -@OptIn(ExperimentalFoundationApi::class) -private fun MatchingCarouselContent( - matchings: List, - pagerState: PagerState, - onShowDetails: (MatchingResponse) -> Unit, - onNoMatch: () -> Unit -) { - val currentMatching = matchings.getOrNull(pagerState.currentPage) - - Column( - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 24.dp, vertical = 16.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - CustomText( - text = "매칭된 남성", - type = CustomTextType.title, - color = CustomColor.black - ) - Spacer(modifier = Modifier.height(20.dp)) - HorizontalPager( - state = pagerState, - contentPadding = PaddingValues(horizontal = 32.dp), - pageSpacing = 16.dp, - modifier = Modifier - .fillMaxWidth() - .height(360.dp) - ) { page -> - val matching = matchings[page] - val pageOffset = ( - (pagerState.currentPage - page) + pagerState.currentPageOffsetFraction - ).absoluteValue - val scale = lerp(0.92f, 1f, 1f - pageOffset.coerceIn(0f, 1f)) - - MatchingCard( - matching = matching, - modifier = Modifier - .fillMaxSize() - .graphicsLayer { - scaleX = scale - scaleY = scale - } - ) - } - - Spacer(modifier = Modifier.height(16.dp)) - PagerIndicator( - total = matchings.size, - current = pagerState.currentPage - ) - - Spacer(modifier = Modifier.weight(1f)) - - Button( - onClick = { currentMatching?.let { onShowDetails(it) } }, - enabled = currentMatching != null, - modifier = Modifier - .fillMaxWidth() - .height(50.dp), - colors = ButtonDefaults.buttonColors( - containerColor = CustomColor.primary600, - disabledContainerColor = CustomColor.primary300 - ), - shape = RoundedCornerShape(16.dp) - ) { - CustomText( - text = "이 분 프로필이 궁금해요", - type = CustomTextType.body, - color = Color.White - ) - } - Spacer(modifier = Modifier.height(12.dp)) - Button( - onClick = onNoMatch, - modifier = Modifier - .fillMaxWidth() - .height(50.dp), - colors = ButtonDefaults.buttonColors( - containerColor = CustomColor.gray100 - ), - shape = RoundedCornerShape(16.dp) - ) { - CustomText( - text = "마음에 드는 상대가 없어요", - type = CustomTextType.body, - color = CustomColor.black - ) - } - } -} - -@Composable -private fun MatchingCard( - matching: MatchingResponse, - modifier: Modifier = Modifier -) { - Card( - modifier = modifier, - shape = RoundedCornerShape(24.dp), - colors = CardDefaults.cardColors(containerColor = CustomColor.gray100) - ) { - Column( - modifier = Modifier - .fillMaxSize() - .padding(24.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Box( - modifier = Modifier - .size(160.dp) - .background(CustomColor.primary100, CircleShape), - contentAlignment = Alignment.Center - ) { - Icon( - painter = painterResource(R.drawable.ic_user), - contentDescription = "프로필 이미지", - tint = CustomColor.primary600, - modifier = Modifier.size(72.dp) - ) - } - Spacer(modifier = Modifier.height(24.dp)) - CustomText( - text = matching.maleName, - type = CustomTextType.headline, - color = CustomColor.black, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(8.dp)) - CustomText( - text = "프로필을 확인해보세요", - type = CustomTextType.body, - color = CustomColor.gray400 - ) - } - } -} - -@Composable -private fun PagerIndicator(total: Int, current: Int) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center - ) { - repeat(total) { index -> - val color = if (index == current) CustomColor.primary600 else CustomColor.gray200 - Box( - modifier = Modifier - .size(8.dp) - .background(color, CircleShape) - ) - if (index != total - 1) { - Spacer(modifier = Modifier.width(6.dp)) - } - } - } -} - -@Composable -private fun MatchingDetailContent( - matching: MatchingResponse, - onConfirm: () -> Unit -) { - Column( - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 24.dp, vertical = 16.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - LazyColumn( - modifier = Modifier.weight(1f), - verticalArrangement = Arrangement.spacedBy(16.dp) - ) { - item { - ProfileHeader(matching = matching) - } - item { - DetailCard(matching = matching) - } - } - Button( - onClick = onConfirm, - modifier = Modifier - .fillMaxWidth() - .height(50.dp), - colors = ButtonDefaults.buttonColors( - containerColor = CustomColor.primary600 - ), - shape = RoundedCornerShape(16.dp) - ) { - CustomText( - text = "마음에 들어요 매칭해주세요", - type = CustomTextType.body, - color = Color.White - ) - } - } -} - -@Composable -private fun ProfileHeader(matching: MatchingResponse) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - Box( - modifier = Modifier - .size(72.dp) - .background(CustomColor.primary100, CircleShape), - contentAlignment = Alignment.Center - ) { - Icon( - painter = painterResource(R.drawable.ic_user), - contentDescription = "프로필 이미지", - tint = CustomColor.primary600, - modifier = Modifier.size(36.dp) - ) - } - Spacer(modifier = Modifier.width(16.dp)) - Column { - CustomText( - text = matching.maleName, - type = CustomTextType.headline, - color = CustomColor.black - ) - CustomText( - text = matching.maleEmail, - type = CustomTextType.body, - color = CustomColor.gray400 - ) - } - } -} - -@Composable -private fun DetailCard(matching: MatchingResponse) { - Card( - modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(20.dp), - colors = CardDefaults.cardColors(containerColor = CustomColor.gray100) - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(20.dp), - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - CustomText( - text = "상세 정보", - type = CustomTextType.title, - color = CustomColor.black - ) - DetailItem(label = "매칭 ID", value = matching.matchingId.toString()) - DetailItem(label = "남성 회원 ID", value = matching.maleMemberId.toString()) - DetailItem(label = "이름", value = matching.maleName) - DetailItem(label = "이메일", value = matching.maleEmail) - DetailItem(label = "키", value = formatHeight(matching.height)) - DetailItem(label = "몸무게", value = formatWeight(matching.weight)) - DetailItem(label = "거주지역", value = formatText(matching.residenceArea)) - DetailItem(label = "매칭 순서", value = matching.matchingOrder.toString()) - DetailItem(label = "상태", value = matching.status) - } - } -} - -@Composable -private fun DetailItem(label: String, value: String) { - Column(modifier = Modifier.fillMaxWidth()) { - CustomText( - text = label, - type = CustomTextType.label, - color = CustomColor.gray400 - ) - CustomText( - text = value, - type = CustomTextType.body, - color = CustomColor.black - ) - } -} - -private fun formatHeight(value: Int?): String { - return value?.let { "${it}cm" } ?: "미입력" -} - -private fun formatWeight(value: Int?): String { - return value?.let { "${it}kg" } ?: "미입력" -} - -private fun formatText(value: String?): String { - return value?.takeIf { it.isNotBlank() } ?: "미입력" -} diff --git a/app/src/main/java/com/apptive/japkor/ui/home/chat/ChattingScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/chat/ChattingScreen.kt new file mode 100644 index 0000000..c904e95 --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/ui/home/chat/ChattingScreen.kt @@ -0,0 +1,24 @@ +package com.apptive.japkor.ui.home.chat + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.apptive.japkor.ui.components.CustomText +import com.apptive.japkor.ui.components.CustomTextType +import com.apptive.japkor.ui.theme.CustomColor + +@Composable +fun ChattingScreen(modifier: Modifier = Modifier) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + CustomText( + text = "매칭을 기다려주세요..", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } +} diff --git a/app/src/main/java/com/apptive/japkor/ui/home/components/HomeMainContent.kt b/app/src/main/java/com/apptive/japkor/ui/home/components/HomeMainContent.kt new file mode 100644 index 0000000..0057027 --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/ui/home/components/HomeMainContent.kt @@ -0,0 +1,388 @@ +package com.apptive.japkor.ui.home.components + +import androidx.compose.foundation.ExperimentalFoundationApi +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.PaddingValues +import androidx.compose.foundation.layout.Row +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.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +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.graphicsLayer +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.lerp +import com.apptive.japkor.R +import com.apptive.japkor.data.model.MatchingResponse +import com.apptive.japkor.ui.components.CustomText +import com.apptive.japkor.ui.components.CustomTextType +import com.apptive.japkor.ui.home.HomeUiState +import com.apptive.japkor.ui.theme.CustomColor +import kotlin.math.absoluteValue + +@Composable +fun HomeMainContent( + uiState: HomeUiState, + pagerState: PagerState, + onShowDetails: (MatchingResponse) -> Unit, + onNoMatch: () -> Unit, + onConfirm: (Long) -> Unit, + modifier: Modifier = Modifier +) { + val matchings = uiState.matchings + val selectedMatching = uiState.selectedMatching + + Box( + modifier = modifier + ) { + when { + selectedMatching != null -> { + MatchingDetailContent( + matching = selectedMatching, + onConfirm = { onConfirm(selectedMatching.matchingId) } + ) + } + uiState.isWaiting || matchings.isEmpty() -> { + WaitingContent(modifier = Modifier.fillMaxSize()) + } + else -> { + MatchingCarouselContent( + matchings = matchings, + pagerState = pagerState, + onShowDetails = onShowDetails, + onNoMatch = onNoMatch + ) + } + } + } +} + +@Composable +private fun WaitingContent(modifier: Modifier = Modifier) { + Box( + modifier = modifier, + contentAlignment = Alignment.Center + ) { + CustomText( + text = "매칭 진행 중입니다..", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } +} + +@Composable +@OptIn(ExperimentalFoundationApi::class) +private fun MatchingCarouselContent( + matchings: List, + pagerState: PagerState, + onShowDetails: (MatchingResponse) -> Unit, + onNoMatch: () -> Unit +) { + val currentMatching = matchings.getOrNull(pagerState.currentPage) + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 24.dp, vertical = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + CustomText( + text = "매칭된 남성", + type = CustomTextType.title, + color = CustomColor.black + ) + Spacer(modifier = Modifier.height(20.dp)) + HorizontalPager( + state = pagerState, + contentPadding = PaddingValues(horizontal = 32.dp), + pageSpacing = 16.dp, + modifier = Modifier + .fillMaxWidth() + .height(360.dp) + ) { page -> + val matching = matchings[page] + val pageOffset = ( + (pagerState.currentPage - page) + pagerState.currentPageOffsetFraction + ).absoluteValue + val scale = lerp(0.92f, 1f, 1f - pageOffset.coerceIn(0f, 1f)) + + MatchingCard( + matching = matching, + modifier = Modifier + .fillMaxSize() + .graphicsLayer { + scaleX = scale + scaleY = scale + } + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + PagerIndicator( + total = matchings.size, + current = pagerState.currentPage + ) + + Spacer(modifier = Modifier.weight(1f)) + + Button( + onClick = { currentMatching?.let { onShowDetails(it) } }, + enabled = currentMatching != null, + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = CustomColor.primary600, + disabledContainerColor = CustomColor.primary300 + ), + shape = RoundedCornerShape(16.dp) + ) { + CustomText( + text = "이 분 프로필이 궁금해요", + type = CustomTextType.body, + color = Color.White + ) + } + Spacer(modifier = Modifier.height(12.dp)) + Button( + onClick = onNoMatch, + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = CustomColor.gray100 + ), + shape = RoundedCornerShape(16.dp) + ) { + CustomText( + text = "마음에 드는 상대가 없어요", + type = CustomTextType.body, + color = CustomColor.black + ) + } + } +} + +@Composable +private fun MatchingCard( + matching: MatchingResponse, + modifier: Modifier = Modifier +) { + Card( + modifier = modifier, + shape = RoundedCornerShape(24.dp), + colors = CardDefaults.cardColors(containerColor = CustomColor.gray100) + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Box( + modifier = Modifier + .size(160.dp) + .background(CustomColor.primary100, CircleShape), + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource(R.drawable.ic_user), + contentDescription = "프로필 이미지", + tint = CustomColor.primary600, + modifier = Modifier.size(72.dp) + ) + } + Spacer(modifier = Modifier.height(24.dp)) + CustomText( + text = matching.maleName, + type = CustomTextType.headline, + color = CustomColor.black, + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(8.dp)) + CustomText( + text = "프로필을 확인해보세요", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } + } +} + +@Composable +private fun PagerIndicator(total: Int, current: Int) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + repeat(total) { index -> + val color = if (index == current) CustomColor.primary600 else CustomColor.gray200 + Box( + modifier = Modifier + .size(8.dp) + .background(color, CircleShape) + ) + if (index != total - 1) { + Spacer(modifier = Modifier.width(6.dp)) + } + } + } +} + +@Composable +private fun MatchingDetailContent( + matching: MatchingResponse, + onConfirm: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 24.dp, vertical = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + LazyColumn( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + item { + ProfileHeader(matching = matching) + } + item { + DetailCard(matching = matching) + } + } + Button( + onClick = onConfirm, + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = CustomColor.primary600 + ), + shape = RoundedCornerShape(16.dp) + ) { + CustomText( + text = "마음에 들어요 매칭해주세요", + type = CustomTextType.body, + color = Color.White + ) + } + } +} + +@Composable +private fun ProfileHeader(matching: MatchingResponse) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .size(72.dp) + .background(CustomColor.primary100, CircleShape), + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource(R.drawable.ic_user), + contentDescription = "프로필 이미지", + tint = CustomColor.primary600, + modifier = Modifier.size(36.dp) + ) + } + Spacer(modifier = Modifier.width(16.dp)) + Column { + CustomText( + text = matching.maleName, + type = CustomTextType.headline, + color = CustomColor.black + ) + CustomText( + text = matching.maleEmail, + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } + } +} + +@Composable +private fun DetailCard(matching: MatchingResponse) { + Card( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(20.dp), + colors = CardDefaults.cardColors(containerColor = CustomColor.gray100) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + CustomText( + text = "상세 정보", + type = CustomTextType.title, + color = CustomColor.black + ) + DetailItem(label = "매칭 ID", value = matching.matchingId.toString()) + DetailItem(label = "남성 회원 ID", value = matching.maleMemberId.toString()) + DetailItem(label = "이름", value = matching.maleName) + DetailItem(label = "이메일", value = matching.maleEmail) + DetailItem(label = "키", value = formatHeight(matching.height)) + DetailItem(label = "몸무게", value = formatWeight(matching.weight)) + DetailItem(label = "거주지역", value = formatText(matching.residenceArea)) + DetailItem(label = "매칭 순서", value = matching.matchingOrder.toString()) + DetailItem(label = "상태", value = matching.status) + } + } +} + +@Composable +private fun DetailItem(label: String, value: String) { + Column(modifier = Modifier.fillMaxWidth()) { + CustomText( + text = label, + type = CustomTextType.label, + color = CustomColor.gray400 + ) + CustomText( + text = value, + type = CustomTextType.body, + color = CustomColor.black + ) + } +} + +private fun formatHeight(value: Int?): String { + return value?.let { "${it}cm" } ?: "미입력" +} + +private fun formatWeight(value: Int?): String { + return value?.let { "${it}kg" } ?: "미입력" +} + +private fun formatText(value: String?): String { + return value?.takeIf { it.isNotBlank() } ?: "미입력" +} diff --git a/app/src/main/java/com/apptive/japkor/ui/home/mypage/MypageScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/mypage/MypageScreen.kt new file mode 100644 index 0000000..45cdf3a --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/ui/home/mypage/MypageScreen.kt @@ -0,0 +1,24 @@ +package com.apptive.japkor.ui.home.mypage + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.apptive.japkor.ui.components.CustomText +import com.apptive.japkor.ui.components.CustomTextType +import com.apptive.japkor.ui.theme.CustomColor + +@Composable +fun MypageScreen(modifier: Modifier = Modifier) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + CustomText( + text = "내정보 페이지입니다.", + type = CustomTextType.body, + color = CustomColor.gray400 + ) + } +} diff --git a/app/src/main/java/com/apptive/japkor/ui/home/setting/SettingScreen.kt b/app/src/main/java/com/apptive/japkor/ui/home/setting/SettingScreen.kt new file mode 100644 index 0000000..b408ecc --- /dev/null +++ b/app/src/main/java/com/apptive/japkor/ui/home/setting/SettingScreen.kt @@ -0,0 +1,46 @@ +package com.apptive.japkor.ui.home.setting + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +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.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.apptive.japkor.ui.components.CustomText +import com.apptive.japkor.ui.components.CustomTextType +import com.apptive.japkor.ui.theme.CustomColor + +@Composable +fun SettingScreen( + onLogoutClick: () -> Unit, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier + .fillMaxSize() + .padding(horizontal = 24.dp, vertical = 16.dp), + verticalArrangement = Arrangement.Top + ) { + Button( + onClick = onLogoutClick, + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = CustomColor.primary600 + ) + ) { + CustomText( + text = "로그아웃", + type = CustomTextType.body, + color = Color.White + ) + } + } +} From 41d48ad8c1bd08015d87dac350ca837ca2b95cd1 Mon Sep 17 00:00:00 2001 From: mark Date: Sun, 4 Jan 2026 16:23:35 +0900 Subject: [PATCH 11/12] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/apptive/japkor/navigation/AppNavHost.kt | 4 ++-- .../HomeScreen.kt => main/MainRouteScreen.kt} | 16 +++++++++------- .../ui/{home => main}/chat/ChattingScreen.kt | 2 +- .../home/HomeScreen.kt} | 5 ++--- .../japkor/ui/{ => main}/home/HomeViewModel.kt | 2 +- .../ui/{home => main}/mypage/MypageScreen.kt | 2 +- .../ui/{home => main}/setting/SettingScreen.kt | 2 +- 7 files changed, 17 insertions(+), 16 deletions(-) rename app/src/main/java/com/apptive/japkor/ui/{home/HomeScreen.kt => main/MainRouteScreen.kt} (96%) rename app/src/main/java/com/apptive/japkor/ui/{home => main}/chat/ChattingScreen.kt (94%) rename app/src/main/java/com/apptive/japkor/ui/{home/components/HomeMainContent.kt => main/home/HomeScreen.kt} (99%) rename app/src/main/java/com/apptive/japkor/ui/{ => main}/home/HomeViewModel.kt (99%) rename app/src/main/java/com/apptive/japkor/ui/{home => main}/mypage/MypageScreen.kt (94%) rename app/src/main/java/com/apptive/japkor/ui/{home => main}/setting/SettingScreen.kt (97%) diff --git a/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt b/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt index 448245b..908d84d 100644 --- a/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt +++ b/app/src/main/java/com/apptive/japkor/navigation/AppNavHost.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import com.apptive.japkor.ui.home.HomeScreen +import com.apptive.japkor.ui.main.MainRouteScreen import com.apptive.japkor.ui.language.LanguageScreen import com.apptive.japkor.ui.login.LoginScreen import com.apptive.japkor.ui.requiredinfo.RequiredInfoCompleteScreen @@ -42,7 +42,7 @@ fun AppNavHost( LoginScreen(navController) } composable(Screen.Home.route) { - HomeScreen(navController) + MainRouteScreen(navController) } composable(Screen.RequiredInfo.route) { RequiredInfoScreen(navController) diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt b/app/src/main/java/com/apptive/japkor/ui/main/MainRouteScreen.kt similarity index 96% rename from app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt rename to app/src/main/java/com/apptive/japkor/ui/main/MainRouteScreen.kt index 54e1a6b..a3d4f51 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/main/MainRouteScreen.kt @@ -1,4 +1,4 @@ -package com.apptive.japkor.ui.home +package com.apptive.japkor.ui.main import androidx.activity.compose.BackHandler import androidx.compose.foundation.ExperimentalFoundationApi @@ -43,10 +43,12 @@ import com.apptive.japkor.ui.components.CustomTextType import com.apptive.japkor.ui.components.LoadingDialog import com.apptive.japkor.ui.components.LocalToastManager import com.apptive.japkor.ui.components.ToastType -import com.apptive.japkor.ui.home.chat.ChattingScreen -import com.apptive.japkor.ui.home.components.HomeMainContent -import com.apptive.japkor.ui.home.mypage.MypageScreen -import com.apptive.japkor.ui.home.setting.SettingScreen +import com.apptive.japkor.ui.main.chat.ChattingScreen +import com.apptive.japkor.ui.main.home.HomeScreen +import com.apptive.japkor.ui.main.home.HomeUiEvent +import com.apptive.japkor.ui.main.home.HomeViewModel +import com.apptive.japkor.ui.main.mypage.MypageScreen +import com.apptive.japkor.ui.main.setting.SettingScreen import com.apptive.japkor.ui.theme.CustomColor import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -66,7 +68,7 @@ private object HomeRoute { @Composable @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) -fun HomeScreen( +fun MainRouteScreen( navController: NavController, viewModel: HomeViewModel = viewModel() ) { @@ -213,7 +215,7 @@ fun HomeScreen( ChattingScreen() } composable(HomeRoute.Main) { - HomeMainContent( + HomeScreen( uiState = uiState, pagerState = pagerState, onShowDetails = { viewModel.showDetails(it) }, diff --git a/app/src/main/java/com/apptive/japkor/ui/home/chat/ChattingScreen.kt b/app/src/main/java/com/apptive/japkor/ui/main/chat/ChattingScreen.kt similarity index 94% rename from app/src/main/java/com/apptive/japkor/ui/home/chat/ChattingScreen.kt rename to app/src/main/java/com/apptive/japkor/ui/main/chat/ChattingScreen.kt index c904e95..4470072 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/chat/ChattingScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/main/chat/ChattingScreen.kt @@ -1,4 +1,4 @@ -package com.apptive.japkor.ui.home.chat +package com.apptive.japkor.ui.main.chat import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize diff --git a/app/src/main/java/com/apptive/japkor/ui/home/components/HomeMainContent.kt b/app/src/main/java/com/apptive/japkor/ui/main/home/HomeScreen.kt similarity index 99% rename from app/src/main/java/com/apptive/japkor/ui/home/components/HomeMainContent.kt rename to app/src/main/java/com/apptive/japkor/ui/main/home/HomeScreen.kt index 0057027..93c6096 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/components/HomeMainContent.kt +++ b/app/src/main/java/com/apptive/japkor/ui/main/home/HomeScreen.kt @@ -1,4 +1,4 @@ -package com.apptive.japkor.ui.home.components +package com.apptive.japkor.ui.main.home import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -37,12 +37,11 @@ import com.apptive.japkor.R import com.apptive.japkor.data.model.MatchingResponse import com.apptive.japkor.ui.components.CustomText import com.apptive.japkor.ui.components.CustomTextType -import com.apptive.japkor.ui.home.HomeUiState import com.apptive.japkor.ui.theme.CustomColor import kotlin.math.absoluteValue @Composable -fun HomeMainContent( +fun HomeScreen( uiState: HomeUiState, pagerState: PagerState, onShowDetails: (MatchingResponse) -> Unit, diff --git a/app/src/main/java/com/apptive/japkor/ui/home/HomeViewModel.kt b/app/src/main/java/com/apptive/japkor/ui/main/home/HomeViewModel.kt similarity index 99% rename from app/src/main/java/com/apptive/japkor/ui/home/HomeViewModel.kt rename to app/src/main/java/com/apptive/japkor/ui/main/home/HomeViewModel.kt index f4f8d6a..455f595 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/apptive/japkor/ui/main/home/HomeViewModel.kt @@ -1,4 +1,4 @@ -package com.apptive.japkor.ui.home +package com.apptive.japkor.ui.main.home import android.util.Log import androidx.lifecycle.ViewModel diff --git a/app/src/main/java/com/apptive/japkor/ui/home/mypage/MypageScreen.kt b/app/src/main/java/com/apptive/japkor/ui/main/mypage/MypageScreen.kt similarity index 94% rename from app/src/main/java/com/apptive/japkor/ui/home/mypage/MypageScreen.kt rename to app/src/main/java/com/apptive/japkor/ui/main/mypage/MypageScreen.kt index 45cdf3a..4d4c23d 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/mypage/MypageScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/main/mypage/MypageScreen.kt @@ -1,4 +1,4 @@ -package com.apptive.japkor.ui.home.mypage +package com.apptive.japkor.ui.main.mypage import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize diff --git a/app/src/main/java/com/apptive/japkor/ui/home/setting/SettingScreen.kt b/app/src/main/java/com/apptive/japkor/ui/main/setting/SettingScreen.kt similarity index 97% rename from app/src/main/java/com/apptive/japkor/ui/home/setting/SettingScreen.kt rename to app/src/main/java/com/apptive/japkor/ui/main/setting/SettingScreen.kt index b408ecc..021aace 100644 --- a/app/src/main/java/com/apptive/japkor/ui/home/setting/SettingScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/main/setting/SettingScreen.kt @@ -1,4 +1,4 @@ -package com.apptive.japkor.ui.home.setting +package com.apptive.japkor.ui.main.setting import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column From c3b69cb118d253fdf588bc0cb26fb6a0b38a449b Mon Sep 17 00:00:00 2001 From: mark Date: Sun, 4 Jan 2026 16:30:35 +0900 Subject: [PATCH 12/12] =?UTF-8?q?fix:=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20UI=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apptive/japkor/ui/main/MainRouteScreen.kt | 37 +++++++++++++------ app/src/main/res/drawable/ic_chat_filled.xml | 10 +++++ app/src/main/res/drawable/ic_user_filled.xml | 9 +++++ 3 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable/ic_chat_filled.xml create mode 100644 app/src/main/res/drawable/ic_user_filled.xml diff --git a/app/src/main/java/com/apptive/japkor/ui/main/MainRouteScreen.kt b/app/src/main/java/com/apptive/japkor/ui/main/MainRouteScreen.kt index a3d4f51..a8c60d9 100644 --- a/app/src/main/java/com/apptive/japkor/ui/main/MainRouteScreen.kt +++ b/app/src/main/java/com/apptive/japkor/ui/main/MainRouteScreen.kt @@ -56,7 +56,8 @@ import kotlinx.coroutines.launch private data class HomeTab( val route: String, val label: String, - val iconResId: Int + val iconResId: Int, + val selectedIconResId: Int ) private object HomeRoute { @@ -79,9 +80,24 @@ fun MainRouteScreen( val isSettingScreen = currentRoute == HomeRoute.Setting val showBottomBar = currentRoute in setOf(HomeRoute.Chat, HomeRoute.Main, HomeRoute.MyPage) val tabs = listOf( - HomeTab(route = HomeRoute.Chat, label = "채팅", iconResId = R.drawable.ic_chat), - HomeTab(route = HomeRoute.Main, label = "홈", iconResId = R.drawable.ic_n), - HomeTab(route = HomeRoute.MyPage, label = "내정보", iconResId = R.drawable.ic_user) + HomeTab( + route = HomeRoute.Chat, + label = "채팅", + iconResId = R.drawable.ic_chat, + selectedIconResId = R.drawable.ic_chat_filled + ), + HomeTab( + route = HomeRoute.Main, + label = "홈", + iconResId = R.drawable.ic_n, + selectedIconResId = R.drawable.ic_n + ), + HomeTab( + route = HomeRoute.MyPage, + label = "내정보", + iconResId = R.drawable.ic_user, + selectedIconResId = R.drawable.ic_user_filled + ) ) var showLogoutDialog by remember { mutableStateOf(false) } @@ -168,8 +184,9 @@ fun MainRouteScreen( containerColor = CustomColor.white ) { tabs.forEach { tab -> + val isSelected = currentRoute == tab.route NavigationBarItem( - selected = currentRoute == tab.route, + selected = isSelected, onClick = { homeNavController.navigate(tab.route) { popUpTo(homeNavController.graph.findStartDestination().id) { @@ -181,16 +198,12 @@ fun MainRouteScreen( }, icon = { Icon( - painter = painterResource(tab.iconResId), + painter = painterResource( + if (isSelected) tab.selectedIconResId else tab.iconResId + ), contentDescription = tab.label ) }, - label = { - CustomText( - text = tab.label, - type = CustomTextType.label - ) - }, colors = NavigationBarItemDefaults.colors( selectedIconColor = CustomColor.primary600, selectedTextColor = CustomColor.primary600, diff --git a/app/src/main/res/drawable/ic_chat_filled.xml b/app/src/main/res/drawable/ic_chat_filled.xml new file mode 100644 index 0000000..dcfcaaf --- /dev/null +++ b/app/src/main/res/drawable/ic_chat_filled.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_user_filled.xml b/app/src/main/res/drawable/ic_user_filled.xml new file mode 100644 index 0000000..dbeeba1 --- /dev/null +++ b/app/src/main/res/drawable/ic_user_filled.xml @@ -0,0 +1,9 @@ + + +