From 40c5b3d1d6e69c370cc46ae6cf22e53a92991128 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:30:55 +0900 Subject: [PATCH 01/21] =?UTF-8?q?feat/#120:=20=EC=95=B1=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 +- app/src/main/ic_pawkey_launcher-playstore.png | Bin 0 -> 44873 bytes .../ic_pawkey_launcher_background.xml | 74 ++++++++++++++++++ .../mipmap-anydpi-v26/ic_pawkey_launcher.xml | 5 ++ .../ic_pawkey_launcher_round.xml | 5 ++ .../res/mipmap-hdpi/ic_pawkey_launcher.webp | Bin 0 -> 2170 bytes .../ic_pawkey_launcher_foreground.webp | Bin 0 -> 3192 bytes .../mipmap-hdpi/ic_pawkey_launcher_round.webp | Bin 0 -> 3660 bytes .../res/mipmap-mdpi/ic_pawkey_launcher.webp | Bin 0 -> 1628 bytes .../ic_pawkey_launcher_foreground.webp | Bin 0 -> 2158 bytes .../mipmap-mdpi/ic_pawkey_launcher_round.webp | Bin 0 -> 2504 bytes .../res/mipmap-xhdpi/ic_pawkey_launcher.webp | Bin 0 -> 2830 bytes .../ic_pawkey_launcher_foreground.webp | Bin 0 -> 4668 bytes .../ic_pawkey_launcher_round.webp | Bin 0 -> 5110 bytes .../res/mipmap-xxhdpi/ic_pawkey_launcher.webp | Bin 0 -> 4394 bytes .../ic_pawkey_launcher_foreground.webp | Bin 0 -> 7554 bytes .../ic_pawkey_launcher_round.webp | Bin 0 -> 7904 bytes .../mipmap-xxxhdpi/ic_pawkey_launcher.webp | Bin 0 -> 5766 bytes .../ic_pawkey_launcher_foreground.webp | Bin 0 -> 10610 bytes .../ic_pawkey_launcher_round.webp | Bin 0 -> 11270 bytes 20 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 app/src/main/ic_pawkey_launcher-playstore.png create mode 100644 app/src/main/res/drawable/ic_pawkey_launcher_background.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_pawkey_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_pawkey_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_round.webp diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 765315af..c135515d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,9 +18,9 @@ android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" - android:icon="@mipmap/ic_launcher" + android:icon="@mipmap/ic_pawkey_launcher_round" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_pawkey_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PawKey" android:usesCleartextTraffic="true" diff --git a/app/src/main/ic_pawkey_launcher-playstore.png b/app/src/main/ic_pawkey_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..12c3878928783bd2dcedeeff537413845f660fa9 GIT binary patch literal 44873 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 hxTm^t$LZv^4& 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 G`hNiXLt`5N literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_pawkey_launcher_background.xml b/app/src/main/res/drawable/ic_pawkey_launcher_background.xml new file mode 100644 index 00000000..ca3826a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_pawkey_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher.xml new file mode 100644 index 00000000..70d34dae --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher_round.xml new file mode 100644 index 00000000..70d34dae --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_pawkey_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8fe8edce1f74c53ff14dae7eaede0332cd15364 GIT binary patch literal 2170 zcmV-=2!;1jNk&F;2mknO7aaXa)@L)D^N);$z9U_GlLDF>)6A_Z6in2UaY3N z@CB;*|G$%z{!5zlpV^#q&N)unoMuMN@AsYg|62IAa9!L(A=zi}r??tct-gA&Jgd+v z$+3atX7#o4ZDBp?=-?K`m4L^Mr>AqEa`^LL^PDDwKDjMy4MdHkgbaQQK#eEYKnv$7 z0KMmUo}6=r(I-cppB5-1XN8Jx6tRVCVI3ZaMxI68x=U^wAgw||5CE`j)Tht3ZQHhO z+dSWVmknY70A!neT-&y7+qUh_wrvOfci^^dB+=db-c3^M7dZb80}^8}Sb{+q?FFu{ z0Ar#!MO9ShK*~rH=_6gFr?v0rdy`%jMjYfUfO7%#=LpWbIK=Xq1sCU>PfBujxd9aW zGAm()F9C+I8uYc#)*}U z;~mEfBBJKwje){IHovyM-_xeq8s^UrWi$vhI%A+R&GRE7$_u1I9L#ctZ2y30_7_}M z=%|qxWRoD%_{k2zQA{54bU2b_c`RDf{!&k(BS(wEH4HYX{pUr8!2>YY7Z=R)AOgwt zC#nB-NHkB}dHxWq^e_FSy<)d&1*~wiiUy z@$>qXfzH1Dp{v`!o@DVAL~@%Wq8g6e#j-l_nx^}6fluCb`y!&2x7#?OoDnEa*K7bF z2LxM|C(&Gy3XVd=P_oLnTn@|fnEN54Il`91wGDs;;cSqrud4clh=|%hAHRxX@n6xQ z@i9C}b$v2M)VqW$;OfRy1_hW)>1KC$d9FA93L=I^%knL5K>6B#Uaadg>*l=U{H_pn zKYr6pF65G`vw7Ut^Z1M9OMxnH9B$EA<7g+x9ZgahQ;m+2OucD;)km&!q6UTIt?asd zx^JGIOh-P4T}MFrde$ZDsa`|mL!1Xg{2lZfm9j1|ZrnRdS-AvyK`M!sOxQ%2Ir84^5(-+NlF8|f|)jdn7kQQUx>AW-xd<&+Iy+5BvoC; zc&M`6_sE=AgL(es#7Hn8k?8q>)O_+(Rfe{`?%Q?{8F;2eqBm_MaCA1e0Q%?46EIdNQMNvP(W6H4L{U zB8~CO!G{xFa^jt)`N1l2`?#;JyQ(MBkWrK@d(F$^RGl?NXPxqXgiMx|7uw^3_wiF- z_yrkS4Bj+5=)Qf&isXn3Hv58`#DQ#gwCnsK)ZkA1%RXdY9B&`Z5g^9!rQO#r<8*%= z->65memn?d1Hjj_fMTs`Ol$yr0P*|r%E};wTte|ub;s|UIL7JTL+nch5iwb9@()DN zIq?$JqU{ppI_LYCX3yR#&PO5U{zb83Nw)D2;<_z8mi6i6cyXdUf;drL=oCcrDg=sI zzmEx%s<)w&8i_W|k9<|NaST^<AR9&kNP9&9645G+I*V{q!`CLF+A}!YxJNE=DoY%%O&@Za!&tiKFPAelzh&# zeLNIK^Y=+4nuI0kNwip=WY5~x{JW>R@4t2cjC(sTpGVZR=KHT1`b{FyBiZ~+N5DAU z_mT_KY$$8YY|AEcK=8fIhwG`~u$Q2$nrz-*_5N>%R$TvIn`J8(M9U0Q_y0J=EDB`Y zXn>ksFjK)S?}Aq9(O4?13Hq)$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..18afb97c8d6b82675074dfc91bfb9fe03141081e GIT binary patch literal 3192 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 e<-z4;budxW^xM;HoQn+Q=oDm literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a5d6f5b9ab798e5c6d8ddeb1d0feb2701ff751b GIT binary patch literal 3660 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f08656e155af0d93755983204cf0489ddb5623a GIT binary patch literal 1628 zcmV-i2BY~>Nk&Fg1^@t8MM6+kP&iCT1^@srFTe{BRne`s|CO9fQ*yZ|K_L;v(1(pl z$2<91@4fea$Isk5T66#R-uYwl|2bc#P)E%u#gi#jN=ggL$f$-A*c!+<#1xqY zBuS>N{^M)gwrv~Fwr$%s&pD7I*;d_%nVBUsM`3T3o-qT4sF;>?t0zDlSq_bq(oS+D z!+lKK5UEHR;xITgq(~VW=7eY&O}6{u3$yUk*K`P&@*Vod%)fQf7Q#@O6K$eksfFo3 zj-0{49oWVvnc@|$&q+M z=gx-8W?Rj8zy6C;vOv*v2(TxH$l(mj3v6!D7XSU#cYdOMYt_Kj8EHTuN(hv?sbO}O z%S_O~sg!D*pODgW0I)BHI>;m?{Q9ggm15(#;E)JZce}|00{L&RIAkIK@Id#`9&JNF zCK>U+KY5WbGf4-)MzeM7Y@*tU0a*psd)#D!#H(p}hLvW5GB+GT1<52ZPan8C$LW?; z79%hna)~R}d)-*shS@Qk{13Nm3>(YJu*JSUt#vuDP}%Op>A@M6m1c>4e((kTSZ0Fm zPfmSj$E*ws%f|7_fx#-u2};^HT#AY2m03icyBpj(l`I}A&gRVD(l9&5Ark|fYPmC$5PZD%J^=W9Ua{{_ z6}1K%%K=Okq>|!)zlg|xccX4{P+7I6b#1{sb?t4M0)WDFnk-PEuWfUggkWqpyv z|LfRUS6;0tuhzA1t=L8Cv7aBS%mz?;O?uI<&(K%Z=>q0@pVuxTqEmxU4?6cYbsz1D zeSf({aS@mJWZ^mtYt><{3TcZE~AD>p;>xIqHuTPTz@aYHt zaM|Hf$v}DXlh<#{i$(457_<~XVJc1H2|Vg&#{jT%JO!zgajZ1z{NJ=RBl7<0C=1Pm z$+d1L0RQdfkh%xJbptn-x{vo1BocDMA=gv%<3nLO?V9@O5to;hD*&KzZXA!&Vi5qm zx)6B07kYixeXye>m)E+nB=~eM{PLvd~8V}eB2s^3s&1L zO3M`s-N*a-FHZc>b-3%b+(?+$sI}Fr*CXw z;4S^in;BJ!|Bv9yQv{ywBli0n8MY))5&8Ozz{^vFKR-eisK_wid}RpG2fXhOtcr6K zV$K8spVIg~tII;vgDl2mU literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..959a0fc7c1b432939dd3c10754fba2036dcc7999 GIT binary patch literal 2158 zcmV-!2$A z02QDGWPpn-ElG=#^!surfNuZ)>mPN^`>*tmySux)yC=o(_x*l<|L|WRSK*7?3Jl<0 zF@SeoSuy}V11pdfvI4*QZiQ6WUv*Sh(_NqHSV1RnE!}MeW*{T*_>I74i&R+vw;41& zYfv)*ecCIj9R~1q{)|9HMa3Iiz+F<}wt!d6a5bzzDzu_=9pSofM#v0zBizk^E^yjk zg#$4F00K>)+qP}nwr$%s2Z#Xx5KOvwwr$(CZQFLXZTEiy{49V#g8(Y%U;__;cbvWl z1;l_K5Ws^8>?Rc)UVdg=bE;s4(p zR-y^Mb1Ix3xKU^(Ab^N$A&?M*wd(d{j5ij#b!v}7k-7_! zRJu7ggMB91AgO-5#`t57Sey+ANH!3#7l)rWSgX~3zuXxtVmlLv17(gBSorY!_qFx>}W^|4*}+#N0=^0>qu$T>{yyDe>EYL8CM?5u@$kaK3Ph z3rI|s1SrNAwJ4EJKk>WM7!uK*u!tv{Yf0*Ue;hGb0S6SS2jMo4h#d@8_xGzvrwIfU z=%_f~Bh+LUnL40IQmRaXdfEOO;a0auTgBx;k-J5xYpi9K;N#m zP$&^mebeaPAB4mP;-v1u;*_86AOkf9E)NE){`W^=4Yzp>H6u2dlmIpzOX@#{{vQ#u ze`b(7o!N(@9MKpKV+2%XMz#O0!V!(WL;~pBn%M2rhKO&7^FfLH@vc1r!I+wqDuG@9 z_ggUD9eGV=V_ft8008+raWMaltfu=d#r410s zv-np)$>v<=AwQYQ3dpV2O3v0Y8>1T~G@as~69Wu= zKEm$xlPDHjCV#Zk44~@q;zp&D`hthP1HigPs~R~VkwvpZ0J3vAUx_?WrHc=z--b9V z-X1TmfYkM*bOoq>ycR8vs&3D~(hRzwczFUd%II{bF^IW&?dKC2wL!mbhk$3brl@|t z^)hIOAr_^1{-24x7~n#t5RoT`2Y7M$EV6~cF0KFj)1&_XFVtWo-T06sz~ z2T`!za$XC03vs*AnGyjCEfLLv^>{8?zo10^WVeH_V>W*5px%=01&Wr(HefJc*w)V| z5u`B^bE<+uO%5~w{gvxS$2EgN<=@cERhh+vck*`i%`5iGZ;=deEI1X zXu0vYV>#%3Ud+sn%p2{DOiUEd90TO`SG_DBfy5#-vB(KeI8$Q6<3C$a-T2cEVy_}C zLCeo9(kGvEe7kGAxztiRH^W zOPa(ashdt4FsN~?`j#ds$$K|4)a+;!##zwxJqf68Fs7>!=);G|+Hnsx5;Mm;3y8AYJI9zez zX4h^4jlTyZzT^rREZtu0m5?aRm(yET-kv4+W!2;L>WupEto4fKM?;}`-qSt;zq2`J zc1W~YP^Gd-PTwDW4*bmI0Hi1OJOBUy literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..ede753c441f2f5b3851a60be2dac2c4b17f244e3 GIT binary patch literal 2504 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 S1=<4Lmv663T{r*#(hmaSZn&5L literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c4d83e6109590591bc3364d2e6d7222428b1aa84 GIT binary patch literal 2830 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_pawkey_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..3f9636aeb49145eae16fe2d854d55fc3255ee85e GIT binary patch literal 5110 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 Ym%fwJOGqrLCT8@&Et; literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_pawkey_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..01b62e2a2565fb62125838dccb359daec0dd7cf5 GIT binary patch literal 4394 zcmV+_5!LQeNk&E@5dZ*JMM6+kP&iB#5dZ)$kH8}kRoS(+ZMh`n$KBoa3?`b4BXD;o zCvqor_lc2QtGcVJ-QBC&tE#QsWmokM_P_uC`|JO9hU~Sz6Trfe6PO{C$Rl^_tRk$V zu?&Z3XJe<5t@7ElC~r>xa7`0fq`h-w&`Z|&y&WsZCkZ%+csY6_B9YC+cq7o zKaOpUZQHhO+cv^G3|}Hw8vp`sau?gSZQFSSJ5wg>2~tk&yY%ary&P?KcMtyrD5pWK z6arERN+A~eKPb}^NxKM0M;79Kpj3!IkV0IUo|QxfH6UP=)yyeQ3K% zrBXUVoTrfHx?`2~NMTzF_oVPf3O}XrUkd*)Kkdusne7JaQMT#{zN(bMq!gY>fm)pj zC_=S*aT1tPw#wO8mF}>nR%e2c2ZTHz;sH?w*mX74s6Bu+Y*G-@Do2-8eps!}1ph%{ zdcc3R6G#CI%6d3?lQIUxXM*SI=Ys;h7MQ`S(Lu7ZOfEh~LBJVy)u#uADus|Whz0wa zdb#)k1+ngMUtNu2IlU`L1XmQqO%Y-_C{t4eq)gihX%vvJDHEL(g3E~l z^_k#T?z1YEv#Qg;?+HWaa^8V148#?R0IjE2H0}^pn?h)!Fj#0(5YGVx@l%5K=PMo) z2#p7Z@5I4lDM*|mbYVd98)JR(D8=-G1obX)ip}Cx+ZhdyNxOBx@ioN#KgrXK3r4e! z0}{BH9CY)}qmyED^(;=lk%3BYYErqWNn{8i`ZASpR+prMBOIRnJj*y>3~TP46!YV2 z5u6$Hq;f>Ao=ho%D^vQtGwz~6t8VszE`h>>s@n)H)dGEp$XyXK1uZJ~hYX^B)6uF~Mkfj9#}AVH?I^mGR)5M<+=k z_+;2S6~U2)Fw~bR#jmt;{`e!WnXqOD!ai!Kh@&7Vf*MTM_xKXVdff^M8r?$ZR7v`W z=n&|PM#i~!lJKWWw|&e&ZA4h=%hggZtP*Hkzrw;hGZ2)1)|Zd)S1_!_iLef9b!nEy z;_Oanr4ABZ!bXoE+_`-GiXJOR*y|Ga4hWP zU+W^G(WabPfH}KIuLzEG1Z60Nmf89)01%=^OA*9T!^MK|W;`}UPo{)KOxWt90&x3@ zis;IO%0OpkbMp#oj)D-*=0VU#4is?vivw_Ke+g%GL-p}A%Nwv(egL8{M!Q@9_RoHX zCOcHRgv}l}lZcX7nOY(u1GRz8%?kj#hfiS)HmFF9WR*aSb^2O@IFv#ol$dy zkVOd;aQ*y;u?z?2f>CvrZu@VX-^F>bM$fU$&)ZpifI zD(QDm0H~sbilF+u@%S{r7bG1TBccj6KfVS4Rfve1n-$JB*BPp-*xbGXfMny-bcn*5 z9rEHVNX8>>#gx8`8CD&Lj*4%#MqQ@(s zij}P+`Ii7dDT#Uq=#b3E<>L?5AlcZI&!Z8O4vi8304$EL80aiegi`95ZtQU<1v4tA z*AUaSZHWhlG_=pn+CK-BL1%sS?CEI!V7k5wWP6TVY9X={V`b{Ne1(Bri70V=2}-|z zCguDxqmc>5qZ3S)HZkO@T<>9E7npcCJBn05Gf4 z5k&Ilaufu4utDRA8HW-XgjN|OpO}>gXsf$`mN3?rDQ!;RiRuA5W`rCp4?v*N&?qgd zw#_yV2n;}Fd48|^4)vsRG#}qk#=}cKKr8u;X^5~bCl^ng1fgES*3V>RiwdCG3y3WI zHlH7u2U?!o+D_C+iLe%z4cEK1KkWeMRVJ(3{8$B>t?%KMs0MKmQ zavMKJZKs@FR12^VtkXY81@djKU(AuP7UPxM)WC}}<}R`m8_EL!{;B4cEkfQ2Vy0`Y zCJ?ypxe9_Xf;-FCc(H@FHWIJtXzW{<5k-1)BNOym%z^9(I>pkji607K7$wYMr3HT*&(ahXFR+R zJ6p$BOJv1AJU7kKI_I}<+1RwJCsRUn7+%CJG(q%vvyDA$>>s_(6-=0BiR{l~wz;ns z771#d2wJVl+74bE3=v7x(~pJK*}Y$ggk?aSTmwfzVC4E0)*GVc%#W_{VyURE9K=M( zoP!{Y=*?k$@jzg(a6^*~A_Kiur@UCFezy{$@Q!p&g23dbcOodoaCVRDdXOT|;^c-e zqUX+@7YkoIq8x27$a_J8I7+aP{lh1Dn{5t_)@XQ)z>AQ`{(Oj@ZhiGc-q+&SI!#Tg zfGW#kUB9E`q}x7(=-jITUI-WaJesy_uAj+~hzZFjXT6Oe4`^X)beHi(^O~Od0alk! zZiObS#pSbfLdN|wZ4nNaVE^bv=e0W|!OI4o)KZp+X$+zD5J>>dRCRwAB&triO;}WGV=zZ*_i;F7?v7KM;<4 z^`~)u`*CG<+U*4L2dZmLWTksxoir~EYqBF;2kbdo%{ z1IW65g_W%*k>QMlwRzayeW1yIP#ud6*gbdwuY~_!Ab^n=$(QG_f=srg!(%!lEIXTi z&hH1X5u?Y-xP3>-KuD5-VSiwvd#>%xD}i6&LCOkuazLFt--OLxs}?}^Wxj;@hU3>e znQiQ|JiqrMtBVJlP1NeMJCPC58jVi4q6~zjo?kIjdEdB(qaX;tGXS5wCTrVTtM}Y( z8>kG<63L$@N#CH#^MkBld;2E5BMo8PS*%>Wm%bWgC1S#LW2I|lW<)ytQ=km^tUAfi zsNT-qlYz$MwTn+SG2>7YQ37mv0RTaHt*>9SV}5e&y89P^K5w*W8NxVA+;Xd2Am33C z)+#b0-*3Q21|VByGc-TGrrYn00U=*l3XabK-HXiXeH?%XDLub;;s2k#0AO?bCal$s z88I~4rQ14mMH&uqP)g-{{w86bVrG#5g5CY6P25Ufp>ghW*+2RKsFDtjVnNz6Tia0v z?rxlFZrL0OOW#Wa>>x(Gl1K;<&lLh-d3MK-1*tj3^gMsORUbWCMo%I~*hX|^xfDS9 z-BaZf*{ACOIt^=fU_(A1JKw?GUTcpz#oJnZ40W%UcQmQ)a2n*CP@-^E! zj3~9UPI3BOA}h5m1J;4KAIUB zn(c_JxP+tU0|2|*cei3OOYHn_@yzrjGVv&To)v!TgBBy4ALD%{i= zx6+0UA#0!aI+y9?1A>2nB_Aw@NZO8DXx6|SLP`N4XiYEeq}a@aeGjfb5x5Dw20KE6 z!`ai69k1FUVY5eqMweLGdMol3iEM{=ijk}mzuInTci%*mP$54(nG!*{c!?;%4VZ51 z@XX5IdHBEc1C}5##q5%r`Qe*va#j#v3i9u2rXo907ksN8>x~>N5G7o! z$}30m=D2sxKP(G@F1$UB$;zfYfGx;ob@^x$YZsY(y!1$(Y!|rOIvcmW|K!;I;`$lp zpYPTFl~h)}`SF#VY+^44YJ<#-Zu#28z5Pm10mcB_eqv@7uhOnyu#OO-3!dq7u5NjL z?@|J=RaMqz@~L^xxlr2yT0-=saslU#7A^J2UHSm0H~^6RCpovjt>cr|n5FT^xG!3q zT&t`WKwV39>-%R57hBgCGwhyPX3qj}%-!Un=k%TduUk}qeOxfk#W*1DTSY);$%-ch z{2o1wd~382k8U^+`>mlui7R}}-L+!rI(HoSS~%2wYbX$hj)Gv}kW4|Y4P51Rhp=MF z1Yu`j2oEU8yNWjlBZ1T+Bg2IRctBX8%rSc!Py}2rayXF2fo8~%NI~|Xq22`Ef36w@ zGRM=`9~Qn00-Db@cu3N4KtX(AZSp86p9t)w26L=tj*4QAr&q@UV}qkT6$W{C;-U}* zX@i0?3L1)l%Ot=FWY6C978PLE*|WQVm|y~Md&Yx=athK4aiH}6R*?gRS_)dn4M!2+ zOA6osa;p_#F)2YP_&R1d@2Y_!zvWFq42POKeT;&l0YMW5?E{733B#Q!!_!FcBLVy| zhHz2{VcrPBiQrFU_%S7TIsv#lP#9UsNjv`7oito1y|Yq~MM3EaDQN2pboB*#h6FRi zg2fTR>TqBc^TUVLVZzejV5Tq7d&DE0@Mqm*^;UAKp&<5K-B3`{H>evJwDk)*DCjt% z0{p}JbIhR9Zoah~4L3^7a=t}D1_k*Plu=OKH)!lPG!FpUu>Z8aK|@WqKTfsZT8>7^ zwPraKBv6o2ZIKidbWA~UMyvfgPq8jaFZYBb*7%Ta*d-WrY46KfQpa_W@=0J-ik-}zX zyJEH{Z02zlhE+Iw%*@Qx?SvUN%#qxMVO{JAlQA?^@Rci-6lVCDp_4%hCuX*F&bkXH zs~D@0aouXnwdQP?V_Gv-VW!7b$n@?x?%1QihAP2{JKmAxmR>V6Qx1gNwhlMV|-$2v|OC1hhp!p}UMhKu`q)^hdyA1RPo%0)B$*t%8922sn&@6$t26p}tH(K$UqZ zo2UXZ+0_dHH=16i{0KlmIs$qkU?&3Jx+35|$Z1yuyhp%Z1av|`n!B6`KtL`61|i@i z0)BxEuRA~l3`an|yKLwR0i!A*;4{edE-Q@+0m(7}0nHGw3jwbzAlnh}7XeQzA)vbq zsE>d|1k6Lg3ty1+z6f}YfawUxtgqvq1_7Oy;tR6h6#-`v&;tSSIt>A-2$a<$Y0u*W~*=ikK;$I#p zwY2a^eC)mCWP zQeak>r}Zn-^OaP`8&V#w8e{6SEt#G!zNwB>R{vREbEnw6vWDgUU%OeR+ZEUHhY3eOI5F#ovh+|fKfHXJs_ z-$5*vAU7!U)1~~=Dk52yQh`hxLBJC^;QUXCpB)fNCdC9>G3mmnRN`g&IkkV02sSZJ zBDv4fRR%aylvuF@YZem|(~89qUZ=BR5>=_;PNKk*fX-K)Iw>(i5f&!0ok%F@<}By` zKPquxs6!+X0@}?}_vP(ntksi=Zp~qdm+F`Uv@#jT`yAvr6 zSB)rfbyAYe87U7|rN29ov+3tmAqQX*+OS#TCVRNhMZ~Ex?EvyT%{u|9 zgR}iSOH`c{#qJbNqv0SW*l;;KnH7U3$U#B~Z!n1A4@z~oCSN~Gf(*AOY*SeC(nf{adctaSq3KKPqS}o<_nnLpiG4>x?F2kgcY_rSN_@NAL4+JikAV17rD8NLv<@2Q6UllB@X1q)vD<&NV9tn%13e0NA0&h+pGl5+Gi=sGO zY&a}TbbGN#%Ka6=g0g)*x)Q@NFw5I5!Zb~uzKEmdX(vUpIWQ?3q`x_G7Xn&JRGz@_ z3~w|#2w8rRJWC-?_2~W(D<*>^ETYLQXZ?%H&zYix)9GLml6+@Dp=AqEHb9=Wkfzqv zf|#_PJFm?z`}Z>oCM<%{Bvl452KJ{7zU*{SY_hj=Z{Yx zX)kt}2?Fw_;H)k|Ziod3rA*##8jq|W_iVUq_^=p(kk6x~^w)7fP#lHVQExRP2GEA#1a-q&{3gfQ=0Q#gJPIQv{>|{DMm0t z!6~d(E0~J%4fDz{T=@3*>Qt2O=1>SWEcxED+FZpW7>%$}21-Sz zWBA4lMfq{%B7Y1QE7o-}3Ocsc8VyF{&qq&!fqrrj??NjSaAFysE^%diIO8Cbz-v%Rx98B$nf8WNs?$we>28nM zOT_R}-p)Wf&J<-A4C_Rdaa`%H4-F457Bd*(M?2YnUWC)@;T0>Iz;!!YJ|AXf@^n&Y zC++3FYIsF)duT}~xk(b`6ir;2!0-;Q*VB?n7K=tGr`|te7EZ0kmFjqtt$+`+k8~v7 zQBJNVDV#UQ-=`ri1Cf%qRAI>rD z$oz6Glw1b0s2;E4bYq&YmSp>S5=NzjS-bhD0=hA$I#{J8IcgumYBexBOgnT_Xw{PX zWD9Qg5&~DAZp!KKvUCr0V;Tc)Vbv;J&U8^kvjtv(Q=uF+!`&&|7RIHvt6=3IA!K^K zL^%j;Szm7%F^lT;;exoyZdMFBtiozEocdXm1CGD1s$mu@9HZekJ+O-6bTiP-V}(&F zVV0mUOhbnIGd64%oRkFv?NsapvoUJO-TE&OCo3l1i%?G&4DVd5Ymq`Nv)aM?sf6~n4jFtQa0OcHqBMaqK}fmk%ep!@dxlM0{+bN+Ej zuEvkQPQJh7CsG`(%6NNXEH3n)Cd@(#p)FpjkAhEA>*NESM|L*kn8$+b2h%U#1D>b&1Ar5T=|9t zyr92x#=s-V<}47dK0!|z?@q)`_X?}ivSKqa&d@Tc*zryoZjR*XB$?!r;kFyF;c+mY z-a}8aF|9p*#r^;rOXBq@MfjDD9qWKWRF_9NVZoDJas-o!HHU@qonaKG%eoBms95UL zZK35dOrY1$ldMmfF&{{_H3u7eu~@pBBOvf!LdoSM3#Zjsq)E_>KYqnlOgbjC>Q@() zL#Ct~v+RXJOt>|NZG4#?FSNrW7fI?FmxxxY+?^yLTR-EVB=TQ*FbHhx+7S#!UQEO` zQtT}$Fs+e4lRKk>gup}%OtHVLmZo-+?=14b!>fA`TsrC2oFGZQDe=a%(jd^8q9om% z5y-?1N_n`hnA}0DmaK1gdS)Vf#Y^{b>Lh7^V@0x9;qk>;-|q;6y#1Vb>3)Nf;1mmP z0t7m>le%J}zgpJ!dvd44UuL3v#Ey2z)BdHwkn(7q9iI=2=)Qmg^Ewg0sh83H0Yn>A z!r~Y|5P0^XdWgr$6q7kAc9&ShW2YEuIWFkpmm6ZxVPGc^*gc3^Io0VFf01l?Jc%lk zoGA(j%-hWv>M59nr)X8)oPBsqN@Ltaw=Hl%Bdthh#iUDAnGh@vnED+f5H@E;n0I)C z(QOM(Ye1k2U35|-lTwN7aB-nahtp^1M@xUw|fHPf`?&?6Z?@&$C zro!p8;--52SpHEN2wvA0Gl^#tJJ#tSGA7m08h@#j@ioGwwj3wXEku%1^9=?`)wA`~ zpPz^wO^EDt8TucL?-3G~$DKPz?b9c#Ah?k^DpIjq?Owjri{TGZq+(tP3!@6m>Nr5H z_x?i^Pq|Wi!61E+CS1lPH@sox{F924n?OXrKl5Ue4>9%eCbMi=WN5h@lfJ>V%^U!J zpE*3SY`Gj|CIQ-QXrTj!;m#||mEie>V8EK|LIZ65VAy0cac*kP1UkI zoutTiJBDKfv&9hPN*5h790M~wp3?+|WBqAWL6!(6v&5B2j>NlQ&~ml!5Gr49XMCl;P1hBDj{=@ zWVTpT@w<@hAeY7IhVo>L7_r!qxS~>hUhA@xxH`- zr`Ivalk_)-aAMbyB40lzZlcFZn54!z&(lY|eEqCYQUXq0o8?KSrwdp$C&7NBd;FO6 zy{5g~)0tRX+7V7uHOZ5jSoPA5Xg;w*F$~92zxl}`rPyE52Tm7Kp!vb zw3FgQJ9uEhMn7WbVSzaDvx6)c`8yJCK%VUK063M+{BljCRmV;Cuwk<>OozA-aptLD z6y9j`1Tw`OD-wrOP@2ND<)ms zL>Dnyi)67<@G@@Rsh6QemUx)~oyiuzGi%p-cI?S8_xwzQkb2|8=Zl{gWDETD1@Q5n zhp>YrDvs)d;orKD{L`waZVzmfq2-@c$e5M~k59p13sG zUyw1TBY%CG0R=@H;_dryC~G{6QVcocHV*m-Pex;C-~h zw6$ytW?rx;JnTh6Kelz519#gbCNtuv=Jdn|sRH+~!}^QZ}OC+{F<@OZ4j znJVB{I!?TcMT<5yKYoS>!{MR+1!RwUt`*}joA)cm%arP5Lz7IK9mFE#c|k6cw0i00 zJO)+%K(R6I2!pCQYM+32`7jCvrq!E@8H)O3URzIlzGKc(dF=~u)?H95UUq>(dTkw=iXm-X0Ec`kHXz_(cP?RmCb4yNTwM5|4| zc|pI!>kXtC-?3Dg1m(&YrTLZ5HStj=8A?K6TJIe%-LEn)wY9PmC^Koy3~~u39yi^` zf7{}DpU$b52E4bpc}BvOoA>}6drq4Y%NW6ImhJNqV6NMsUh>^VR}^h;F#=&ZYM+32 z(b(}0Oj@Obp+~kmM0I<;eH5qLWe?ybk-bo0#2Iq3|XXLH>y=lNu=k@(WaRy@cg4-!TOL5H4f2KkRMg=QIO<)$!-m2P)zjt7iLo zVOD|v){jutC?4}#MP+`V)=G1+YkUq8!Vs0hlp)T!=hH5#2@`0e3@E&4`P66IrW!L8 z71iTYrc4xu#1gnn3yYYF8$JUr^b5=Y2 z0N@FBpSU{dawi+^@4x-kCo*5BUWNg*R3;Q|u2sBv-eF#6W)QKnxbZI592O?J=jhg{ zf{5mMlQ|4GEZogwTvZ znD)z`gPf)s6W@wSmtDZtyHwhEfsFPT|H^cD4yA;KLlK3#M?#8RqOs@Ku zstUvLPbbH*{~7Y@J=^yaj)z|*4os<-{o{dwUh;HOx?_0$gC9rs?`OU63vVq(qA2DgW+myj05hxZ5~Q@IclGPbKMNzQqQ7N zNG_6eI)?8&xY|mP9ps^@qjLlIa4}+`6>@pnNfZ({)q`RDYUkvD8->^DX;*rUpm4`c~mYKLkQRSJ{PzX7KSM}v5(pvbtGP&X2FU5iVxST+^%l0Vaz9kj;;)EyiX@xUfKyF( zedI;G1+bUC9|JG-FIVTy_#3NE_z8gfAH2n5A4e7ET7zhwagsfXaec=!H+0*u$_ zl#hC&U4$_Hr-)l01 zfi^s@YTdRG#pO2P+$8Ann zuhPVi1&YVm%syEI=Q}#}v-;idO}+<+{dqg;cTdHGfpyOTsq%rdSUN#Q~lITCNAP|rRyeh+y3<+{QO!w;v?>+AK@ufjU3-ol#q^?`wmr{|nHzJ0puLyo^Mo~t$h82oz5@^<5P{T!wZhN)xi z15Nb0P#hRjf?64FcelJ{RFBU!Ry6d`3b|@b@DNLd(WqUvlUv3JMcp#8&7tezLRllj z)|sNvMC}nPSZGw3lnTSVtV$Cw)@nErHL}A2sG_mZav2@9KDuzG3L=_Jbkvu~3X;b8C_m741dJrl*Xhoj&xDfz44X4x5B|~q$ z(6UAA+}1-L1Y{481ZvLuw=gQT+31Sd{L1}o9kl+55s*cmV;-3VpuX;_dg_P|+&vKR zoe&U1o`7jrApw}r)rmzHc%SyKfPht|9Y7xa*Dj6-V943{wpInNQ`m`xe#Bl%xK${* z)Q{MS1VXSXJF~x3Nq~U+2xzM(Fain?aEJ^5F5|Mq)k&oksf^xU)*O}_ANJ~r)~BRA zUYFtiMApwo?n4;lAf0*{y_OrKPsJRyPe*wDsdik|hRf!$DMd0%IE_a7>myH~0truo zfI<=>AhbpmLclSyeLs7I;VI(v;UE#4$u;8T1}r+u$Ajh#Aae1>5|zh%XH#uhBv5Sm zJRdmL_W&}w&eEMkdIa>}1StUg=6io1C61kdr?*=i>9*AkAaT*pO?!2q`}>=Tzeo-e z!bh&zM+HJ6;K@exM6R$D1pFrkK;A*#5xQS}lLD+5H1Dck3hlt*j+{{y-k#sL^(RxE}FEBgP`=exeA<&y(JU7M~? zCjBzIBuU{WbD>2;?Y&m7UOiXiOTA#j)>Y8PcQhZv5FA{)cJ0~)mrVw<3S>pV`(^4$ zjewn`k+;vMCpH3lPM@CYzAw2DkdA(FN83_1HOI?o2om~2ND}jLjbmUuN zwt9jGAYk-L=?DQ&N99g3eOD!XX~?${0+RJ)M?kZi(NM`J*OUGdzVzdIR6X$#khm23 zLBQGbldt|<-Dt-R0X^!IPyaLsn1g_CbTiW$uc_CCm${c7X{JX6tU^G7UN^RXJ({^* z`+8m3_;%<80goHk>rMoWM8GFnDete>p>+^2t)zuUEG1j5qf7K{ULFBYEc9V%^zv=$ zb!(l=m!yx9m#?GOwQaUqo;J$2+NNIj*74sCU3mG|(d*>Kuh%0z^mx6-^}4$KvNNTH znchqLdfh$M8g6vpw#v)sb@^)!)YDb|`6A%TK%Yjh+v}hIs3m>no$t*qfqtH_@!iyLZ+bG)uIoP2UsZSi-~avHy-4;~aWW6UWK(x9fV;<3%@ozq#neT(rt<_yq!Z#%r}$ii zEipyb_)dh&R!xSxTTWv=8KJwoZq+PRCmHUXONPt?AYFAS9=SV2?sl3%HSSJlxV!5E zOf>rfkh#0d`CW#D?)em{&I6pL=!AFCeYj0@8QwUP;W{zrhr@=r_23r~5nbVyQ8hS| z;xgeC@jd|353on(+GMlnX4upTIaN+0$yTk7{i!FJA(Q9cXGZts4*=z_a$?)I+UzMu zMl#b}Vv}+e+scjrb=Q&r*|up%m3$kqZG6QZ+qP}nwr$&<*tTt(-)}>ZBsXp|APXR{ zgpW#eB`>h5|NnYN&i!8!GfkM884re&-EGhL|9`*lFOxg?tr}gpiK(reGBY!H&bTtu zf~y?8YM#Ek3)EOPM*U)dtGhdI`*R%#f$5dCG|_H;o>7)cXG|tg2$g%uE>-Ri=zCSC6Z& zn`jRz}p}?5M3>VL@}+_JUQ>@03j7)cWsoGu?T`OUn|vg+3a)O# zkTH+2`KnlDY5Wm$z*)b$F;aL7$a z1+T_IV{NRl(+8Mlr!lrRRuMwJ_8`bGg(%B;A15_rKO~oAZ^?j{GJ1EH`ios2H_%EfPuDXw4cGE{C`GBV=~SGbcEJI!9u7UK9fv_f}MkW zHd&(^H@-mTBw0d0P7G#x`?UDApx@xnQzhn0BxtNcNd4m=ECXLw^4a8_2ddfgDKbYl z%Gpc)d1#=cUc9+-xH6~64u^}+H%dNh$W}>7iGaRP+AG*ZSVM{lM1_|b{x{mW)j>WO}MidSfzK*ycMbnOAwF?WVXZMLp{Nq!=FUFT8ZVh6%5Ad$c_|Bvjka^ z(3C%(tU}<`B)CG_2?rJ4%sUMtLJ4aGf;=+a1R~AiT_T`aeYkRY93*d*Ht*O&$dZVT zsE7nyRIrJ#f;3{zL4LNmhn}y_WDSSY&by~XuA0AAiN{ZLB5w_Y!f1((=LY$1KuZFe zLSZM+(1DGO08)q>=U+#@T9YLN%xNrye6o$YK$mXn? z!$;g{h)tJm5C{&D1C^>-e+h}t)l5*h1DUM)e@4)f3>3;YfG%q;pqyHtQ{Zz*>*PCF$h0SR~n4TFQMC80$!MH<0e6dAntmklSvAEUg zNNt@wn*}>OUbB2h1a4C#2t=6L8)Sw#C5IIJ3oZ5h)fSIups#ZFq9duc_YxMYVX(CJ z34)snAQM1gmQtvbvK2qK|5I5(zzkSHA!(g69f_q@UluH(;P_m92!uAp1!36FD5X^w zge8YAqQPY*Kch`%;F}4>mX5ew{mU$vq9W;HU zIRoaHcwSF$7M2$th!ww=2yRLU!t+Y$z+g`td>~q4hfVh6?nf-h`_geYD>#hlM1^_7 z#jhnIc$dP^dLs;fi&m+}7bbTN>7CQ1F>zBJNwr;TIE?ATzKY)~gukSUz#pj=+s9%U z$t1@osoderZ1~ws#H5OK2v?>;fj1`NI;~QVAH*0RDK1-OBO(yfkvX`uMWL8>ODMGs zEG30h;Ru&%F?|vE5MsxG_(FpT3os}$n$e-0J=@~&EcD9gT_7UE>ViQY48wB{%B0+9 z;t`W7yG)p3vlSh=`#(ntl?8hOLA&`v7ReHT5WK=_qE$!0?AJuYgtYdlB^1mw3=+#7 z9r>40XBJ#J+y=G+hbjg=W5!;c6(oR5P{wBm!$(Wm<2zdnmW3~8^v-k?y%zokivm4e$U=*H`HqNEbUbT@^X&A_8L~;{9-ce^ zU2RTZFN`3fvSUR4W#}Q2u<-1>^AHg+qj&ygI4*2%&f%Z6Mn(z&xiVHsD?YF^As3lG z39Md{nE_`Ot5r|oW3~mjTa8JT_K%D@@q7buS9)OD^=M%0Q;1SyUL_x-F9UB9Bocdx zjHIT4u6L$0)T?*)lASmbrTs#vHm6$`%rL?Ma)zee{n`_W3|=wZ9~I{6is?P{pkI!R zq^powr1l({Ot)-G7oXF#YN^vdB16dlvpvx6jtZxCe)4J&B|qCG%U~u>DtA!8hrdGG9`e<~U z5Lk3)1}oGXR{lSWj8;nH&>8^;GmP@@5rxvOKb@H@5Cc-``=qgd+z?O5mCdQppG|8h z)QLvlSMK4T!aYKh4q&Lw(WlH{IB@8t+kHJJDoxyvoy{lA7dfpYs7SgCL}2PWiSy>? z+Q1QzeIg^NqUS? z;-F~ukjOSTNz_NgL{Y9)weQp{G zOY_rPdWw(nMyeUIghHaC83XZSJm7~1j;MlpZy*6^iHSs00<6M)5o(9!?qeDdrE5MC z#56Irux6 z8Wh`_52vexP^?*hBBJrZcY(D1^6IqoaGdZ^Vy!lCxS-2&#pRM~dmly-T|0=S5c?DA zjgVe6s)#i833H_uv6hBF3Q?hzk>M01B`^g!yrUyxZGhQf2KXSw@1uk?)v0DL-wrU@ zx8Oh`IgrS1Jb}O2o>=MR?0yLy9X;6L1(_fh4z~vZJqS_&>ah|k9Rn1EQWt}ngaaW* z@OoDkheKq8ME%o%h=up*Mt?)0w})8zX9*!P6unoit+yl&OXDskhGnN2oimBBA%s|K zwye-i1;O5mU@y@_i#k|l4zFN8T6X2}1@+K^`y@J9IK7EzbV;lcPA5|)az+izzk zQ-+0)|1bWm2^hu(d2?oO2&N*5!!4w;+j>pF;4`7v6i(AzV*yTd#y9o7lAB)?5lYUx z0ZT{we+|^7_~}fo#NgBy&m{h5Hbu}oa1vhKzY z4}qnn?CCw&<^Hvnv||zwkZ=IA0V-XGY?Fvo4nQq(54}f0dC6C?V`=}P?qCg+EsjB; zT5)i40GzVb{0tpkUAy5Xr5MRLbAqGYVcR+u|JwPGTQfhO&Nv@j?mK4l)tgu1r#A=LJ)g{)+%>@(mOHErCwp{DBr074#odw0 z-ZH~kpMKDV&1j#YeM;N$4Cn7OXA!tA{4m>#wAyNE2eUkw% zxq2otg^zh$x(pqWwrI@r$>aOI-5Dbb1_l!A z*HT*ZnB{!k<)BRnPB}3gTO3ZccthfWqR`n-L{y5G^aG0|)FG+*IYS0)Pa?LE9=mmA zb7jsTM=CXAa487n;YKGDmZt9GBq^H;Krb;x$n%tR&ELSWCy_|x9sYf_My3asJ8ywX zTKDW6V0x_pNmQ!}K?T4>QanG(wnGO96OfDqe{eY&{$cfmqc4e4R)z$@``$iPG9UQt z7csGsYup2o4KTQ|k{@-~p#ua(@s;MbCMurm3+Bz@EX9!4J{g*`>V1=?aP`Z9v-^D- zDAh~vgj;QxN`GMj_yu#DhQ`idg6*D?pB>RqQqEo+$rR2mKciLL^m6D(+UseNgjhD; z+<4{s0yTv}zyR3#as&5qR`3JJrO6jBM@QCn$kQPf{bC2 zAWJTopa5`vF^}$v?rwZFdNUr*45sKW1=3`_cxkAM$Qpk**yT5YPU++Sgk&-m1V+ue zGzbO)t;#VHppTpbXhzrB>%n27xJ<<;tgvjT4=)wIc`%Xj>;G37&{p3Q$&>;?6cmGF zOqG3yPNi%BtBY7Ardm}k8bey^WG*;grMFrq`t6P03bna(;N3Ha*OIUkzkMYA;Y4RB z|DGfY)vAKi&{3RBI|YRTD{UPtfKe>MRcIliakmp`jP|{Ih^4y~rQ#96#L{>vA$v*{ zB1=*=Pinno;KB^_$pP;q9=44zr7Q(yZ(sxTqj81Mfy?}3iKjthi$wYxtnDZyvD7*T zy}xsNbAZXVq%eOp(Bi!B05jb&9{iS~C85-EqS4TgfqivG#qR?(HWSOXnjMc_YEdHS z2~4Z}Sd8%}ii(%@=WDOz>-7jaYI=z)hnG-jUR@IY9PRqkiNTO*!R5q$25VaDIQP(7 zZquLIYTx&G8zf@owB^}J)vhQpY}n)_e))XYNDF zJ%DC1NF>SV?uOm?KvULE4{FN`pc*Y2fIQ(F(S^EyHX zd*k`Y)Cr2i4f5HbsPTOvuE3_=^3lC{$`qeU@1D1U3aKOvJ$)wFWW#C%J7^_bfLSbJ zxk4N>j-G!V_t$K`8h=0vTlVK~uryPvHAgcNe`a!RkDhVP)j7CQ7J;(6uw2H*Bx4S+69D6E-b6Ree?i3EY}bv$ zvqhsT))5&_RU+b{?C=CY*)FBFXJDrk5*f{qSm4ri*h&=Yc0+RoSjQq)0IujUOKBc< znVD`2KW9X&T)+r|+w~ajh;^TrIrZ&fr)y=e!zTs4C;>RQK17W~*JT75LUWlpe-3f_ zHnDO}#RdUSuI@^R{Y2N|QL5Q9;$Cht4J18_2*k%?|2%FUW#|Gz9T#K)U^p_yB}2(@ zS(i1uz7WhCUltK#k_EFUI-U+u+Bql;U7n{zru=;{GJcMLYLLvaWGeI#r5bb>sa@bVKLT)k5rK=;QaRAM|)>7d40tQ12(N1EtoXyZ#^c=Zs z^s+;+ExV35Hq9#hzbr}PxG-7u;NDRs6dF3RMmJj&azo|+ldk#pUk2y+(YHt39A7OD zL|f@uokvG8LP&dhnA#8P_* z#QncrCIN^tevj$5nmysu{GmPHnoisygaGqlF*Pn~%*N7FYpJHyL>e|8BB?(7d6kz^ zW14lcYD9ddE1N^QmrXKt@exJ1I2Lv!6qW%Qv1Ce=q+h z8z}~?5 zhQSFlCtI&r&S$^h;%TVUnaLh}ZHUrYs7-6W8ICUmjDvTVZ#U+q6g7S0dzy6y@0c`- ztHnU^_e2YfWnYb9CPchV~AU}rkRg~|4i%A;es%eF~~Sh=KU(~AjL!8j#E1|#Owhp8T` z?Aih>0L~$ZYs8wKO-{q9(eL}Zi2~!@6x_yizZ%Q@-s)NjR7GvMQ$gLKKs`!!>gNOQkQGJ-$nC)iP`Vu6~J_uQ46!xpZ?iE?V1nFx5JsRM+3xYd{<_F!)@*?hWTuq-B8I?XNXWnMjg(U2-c@-8#X5Vdzhr`joOU8!Fae(1qT9sdN3^03JNJJ_^xU^8F@L8DLfb@ zHw+GBWY3>tma=Rq_5kT=;wj8T;0I?r3w`wa!jg;n5uQI{^ z9_E5N0G~Mr@&K}Qsaz#We$QBA)jDi1(r*0yQ+6@rSlyCkQDE*zt{5?k0=ZGyPJ%9? zwL*v(Yit1eZN?tp(j|uZrz#e(MO_K17q4#-f#DftvB6AHGY@Jz!^l;&83z{|Y!M_x zH9f_F47$WH-;^RZNIPGP@aKZ3f!I+P$c>71864;orj8hs!CwK`mL(gsi@7iw9i*C9BC46=Y6abMSh`L%gbVRH_AtTDi9>0miMy(V#hqv*JSq z?lS6_X;IH74tc_QXz%*0U@%)W`YrAP(VIftf!JJi@KY$~FRJC+IOC`mZwnnUzSvxV zw^FmnS=^}}`j;H~P1|aq$~Yh_7#m-jgT$cKI676iH{KNR@H)e)nuBQcTv~NSGSusQ z(f=^wG>wtM<=-6dB%jRaUyidITHw|2k7}Ozs2@G{`Sl>I4gZoSJGlAD&Ae@$2WC@iv#~!#8 zu>JV27YctoFrUx;+(#7Qgn0%5CRoprrsb^h#U32Q({oitRQ5J(LuIuIre?RhsYQ4=w}s%b^CBR9waaZaVqqz4At=c|ePiHNn+bKkKud70 z$;fSQ=qa2Q_O4FcHmpE5VE>%jXS)nIQ zyv&xs$`N%FBc{E8Lc* zX`MV;jLXYCEm}+9@Hm+xX+armGyx!nGEFIB#xJWGDOEJ# zPRL?pGMT2@YPl;uoyJ%uTMQxMiV6Xdz}a#jVaI)9NptYFa4ven=K@$cS-GXBL?RZX zcS~zo(==O*>m{0t=W#4Dc9_wFWb^2_pAFI8s0d2$oEtrJ6D7FI3B^?Ii9r*MFE0uR zPVXV7TKXW^(jmswX>pu|UE!9&i;Bj z&Bi~Y#c`aAzQnl!c4milF|pYjB@)d*>X_cm#O1I%2iP>h*v>Mc%S_t+eI$4ONptYoe@33x^E{WB_zKF{IXB~$-ciaQiEO}=a}!2hDa^`f z9u6;?_$Atec%4N%bL}`>bLLvn>n!OK6MtF5WtgS#GU8@}4xx_`}mI!(-(6qQMSN?fVVac`3J_VzY>W^bQfvNuN^SBtJCZ&GeMo=LgJ K_XgBzVQX0(b_4MM literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..dc2ffa577da2864be2967d52c0ee93d24dec5314 GIT binary patch literal 5766 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 EMf4~pq5uE@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_pawkey_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..33193f935acd27b6642b20928b02b981ed47bc5b GIT binary patch literal 10610 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 literal 0 HcmV?d00001 From b96afaefb2d5c4474a98808adf94ff4197507e79 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:31:33 +0900 Subject: [PATCH 02/21] =?UTF-8?q?chore/#120:=20=EC=9E=98=EB=AA=BB=EB=90=9C?= =?UTF-8?q?=20serialname=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/sharedwalk/WalkReviewRequestDto.kt | 12 ++++++------ .../ui/course/walkreview/WalkReviewScreen.kt | 16 +++++++++++----- .../walkreview/viewmodel/WalkReviewViewModel.kt | 12 +++++++----- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt b/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt index fa79c61c..f0b7b1d3 100644 --- a/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt +++ b/app/src/main/java/com/paw/key/data/dto/request/sharedwalk/WalkReviewRequestDto.kt @@ -8,15 +8,15 @@ data class SharedWalkReviewRequestDto( @SerialName("routeId") val routeId: Int, - @SerialName("selectedCategories") - val selectedCategories: List + @SerialName("selectedReviewSetList") + val selectedReviewSetList: List ) @Serializable data class SharedWalkReviewCategoryDto( - @SerialName("categoryId") - val categoryId: Int, + @SerialName("reviewCategoryId") + val reviewCategoryId: Int, - @SerialName("selectedOptionIds") - val selectedOptionIds: List + @SerialName("selectedReviewOptionIds") + val selectedReviewOptionIds: List ) \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt index ac50af71..2ae4cb4f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/WalkReviewScreen.kt @@ -55,7 +55,7 @@ import com.paw.key.presentation.ui.course.walkreview.viewmodel.WalkReviewViewMod fun WalkReviewRoute( navigateUp: () -> Unit, navigateNext: (routeId : Int) -> Unit, - navigateShared : (routeId : Int) -> Unit, + navigateShared : (routeId : Int, pageId : Int) -> Unit, routeId : Int, snackBarHostState: SnackbarHostState, modifier: Modifier = Modifier, @@ -63,7 +63,7 @@ fun WalkReviewRoute( isSharedWalk : Boolean = false ) { val state by viewModel.state.collectAsStateWithLifecycle() - val isValid = viewModel.state.collectAsStateWithLifecycle().value.isValidForm + val isValid = state.isValidForm val lifecycleOwner = LocalLifecycleOwner.current @@ -99,7 +99,6 @@ fun WalkReviewRoute( } LaunchedEffect(routeId) { - Log.e("routeid", "$routeId") viewModel.getWalkReviewCategory() viewModel.getWalkReviewInfo(routeId) } @@ -112,7 +111,10 @@ fun WalkReviewRoute( sideEffect.message ) - is WalkReviewContract.WalkReviewSideEffect.NavigateNext -> navigateShared(sideEffect.routeId) + is WalkReviewContract.WalkReviewSideEffect.NavigateNext -> { + Log.d("WalkReviewRoute", "navigateNext") + navigateShared(sideEffect.routeId, sideEffect.pageId) + } WalkReviewContract.WalkReviewSideEffect.NavigateUp -> navigateUp() } } @@ -329,7 +331,7 @@ fun WalkReviewScreen( feedbackList.forEachIndexed { index, category -> WalkReviewFeedbackForm( icon = R.drawable.ic_walk_review_location, - title = "${emoji[index]}${category.categoryDescription}", + title = "${emoji[index]} ${category.categoryDescription}", selectedFeedbackItems = category.options.filter { it.isSelected }.map { it.optionText }, feedbackList = category.options.map { it.optionText }, onClickFeedback = { selectedText -> @@ -413,6 +415,10 @@ fun WalkReviewScreen( // 공유뷰 아님 / 현재 그냥 리뷰 if (!isSharedWalk) { onClickPublic(true) + Log.d("TAG", "WalkReviewScreen: 공유 안됨") + } else { + onClickPublic(false) + Log.d("TAG", "WalkReviewScreen: 공유 됨") } }, enabled = isFormValid, diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt index 8ddd6ace..ad9fe28d 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/viewmodel/WalkReviewViewModel.kt @@ -19,7 +19,9 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.collections.immutable.toPersistentList 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.first import kotlinx.coroutines.flow.update @@ -36,8 +38,8 @@ class WalkReviewViewModel @Inject constructor( get() = _state.asStateFlow() private val _sideEffect = MutableSharedFlow() - val sideEffect : MutableSharedFlow - get() = _sideEffect + val sideEffect : SharedFlow + get() = _sideEffect.asSharedFlow() private val userId = PreferenceDataStore.getUserId() @@ -69,10 +71,10 @@ class WalkReviewViewModel @Inject constructor( userId = userId.first(), imageFiles = imageFiles, walkReviewRequest = requestEntity - ).onSuccess { - _sideEffect.emit(WalkReviewSideEffect.ShowSnackBar("리뷰 전송 성공!")) - _sideEffect.emit(WalkReviewSideEffect.NavigateNext(routeId)) + ).onSuccess { response -> + _sideEffect.emit(WalkReviewSideEffect.NavigateNext(response.routeId, response.postId)) Log.d("WalkReviewViewModel", "리뷰 전송 성공!") + Log.d("WalkReviewViewModel", "routeId : ${response.routeId}, postId : ${response.postId}") }.onFailure { _sideEffect.emit(WalkReviewSideEffect.ShowSnackBar("리뷰 전송 실패!")) Log.e("WalkReviewViewModel", "리뷰 전송 실패!") From 0dc193c27d628b346a4a9e19f49a5ec603ef3db5 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:31:59 +0900 Subject: [PATCH 03/21] =?UTF-8?q?feat/#120:=20review=20=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/course/walkreview/navigation/WalkReviewNavigation.kt | 6 +++--- .../ui/course/walkreview/state/WalkReviewContract.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt index e23ca46a..650816d1 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/navigation/WalkReviewNavigation.kt @@ -23,7 +23,7 @@ fun NavController.navigateWalkReview( fun NavGraphBuilder.walkReviewNavGraph( navigateUp: () -> Unit, navigateNext: (routeId : Int) -> Unit, - navigateShared : (routeId : Int) -> Unit, + navigateShared : (routeId : Int, pageId : Int) -> Unit, snackBarHostState: SnackbarHostState, ) { composable { backStackEntry -> @@ -34,8 +34,8 @@ fun NavGraphBuilder.walkReviewNavGraph( navigateNext = { navigateNext(ids.routeId) }, - navigateShared = { - navigateShared(ids.routeId) + navigateShared = { routeId, pageId -> + navigateShared(routeId, pageId) }, snackBarHostState = snackBarHostState, routeId = ids.routeId diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt index e128d969..2dd7bfcc 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walkreview/state/WalkReviewContract.kt @@ -37,6 +37,6 @@ class WalkReviewContract { sealed class WalkReviewSideEffect { data class ShowSnackBar(val message: String) : WalkReviewSideEffect() data object NavigateUp: WalkReviewSideEffect() - data class NavigateNext(val routeId : Int): WalkReviewSideEffect() + data class NavigateNext(val routeId : Int, val pageId : Int): WalkReviewSideEffect() } } \ No newline at end of file From d6fded8c0511a818cf5d61cad22266a4d60388f0 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:32:29 +0900 Subject: [PATCH 04/21] =?UTF-8?q?chore/#120:=20course=20=EC=A2=8C=ED=91=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt | 2 +- .../ui/course/walk/viewmodel/WalkCourseViewModel.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt b/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt index 954934c7..269d90c2 100644 --- a/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt +++ b/app/src/main/java/com/paw/key/data/dto/request/walkcourse/WalkCourseRequestDto.kt @@ -23,7 +23,7 @@ data class WalkCourseRequestDto( ) { fun toEntity(): WalkCourseEntity { return WalkCourseEntity( - coordinates = coordinates.map { CoordinateEntity(it.longitude, it.latitude) }, + coordinates = coordinates.map { CoordinateEntity(it.latitude, it.longitude) }, distance = distance, duration = duration, startedAt = startedAt, diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt index f52bd909..00a4692f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walk/viewmodel/WalkCourseViewModel.kt @@ -83,7 +83,7 @@ class WalkCourseViewModel @Inject constructor( val routeEntity = WalkCourseEntity( coordinates = state.value.poiPoints.map { // la, lo - CoordinateEntity(it.longitude, it.latitude) + CoordinateEntity(it.latitude, it.longitude) }, distance = state.value.totalDistance.toInt(), duration = (_totalTime.value / 1000).toInt(), From 031a4f89a5bf8672cd107af92ca5f57386ff6b2a Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:32:43 +0900 Subject: [PATCH 05/21] =?UTF-8?q?chore/#120:=20=EB=B6=84=EA=B8=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/paw/key/presentation/ui/mypage/UserProfileScreen.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt index 31f418eb..f453e0ff 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/UserProfileScreen.kt @@ -62,7 +62,11 @@ fun UserProfileScreen(name: String, verticalArrangement = Arrangement.spacedBy(16.dp) ) { UserProfileItem(label = "이름", value = name) - UserProfileItem(label = "성별", value = gender) + UserProfileItem(label = "성별", value = if (gender == "M") { + "남아" + } else { + "여아" + }) UserProfileItem(label = "나이", value = age) UserProfileItem(label = "활동지역", value = activeRegion) } From f4873bcdf0b893f661516a0b23ef39aa9004f966 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:34:45 +0900 Subject: [PATCH 06/21] =?UTF-8?q?feat/#120:=20=ED=83=AD=20=EB=A7=B5=20?= =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=A7=80=EC=97=AD=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/course/entire/tab/map/TapMapScreen.kt | 8 +++++++- .../tab/map/viewmodel/TapMapViewModel.kt | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt index 61cd1aab..2081d69d 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/TapMapScreen.kt @@ -126,6 +126,10 @@ fun TapMapRoute( } } + LaunchedEffect(Unit) { + viewModel.loadInitialLocation() + } + when (state.initialLocationState) { is UiState.Loading -> { LoadingScreen() @@ -147,6 +151,7 @@ fun TapMapRoute( navigateUp = navigateUp, navigateNext = navigateNext, snackBarHostState = snackBarHostState, + regionName = state.currentRegion ?: "영등포구 여의도동", mapView = mapView, onClickTracking = { viewModel.updateState { @@ -170,6 +175,7 @@ fun TapMapScreen( navigateUp: () -> Unit, navigateNext: () -> Unit, snackBarHostState: SnackbarHostState, + regionName: String, onClickTracking: () -> Unit, mapView: MapView, modifier: Modifier = Modifier, @@ -194,7 +200,7 @@ fun TapMapScreen( ) Text( - text = "강남구 역삼동", + text = regionName, modifier = Modifier .align(Alignment.TopStart) .padding(top = 18.dp, start = 18.dp) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt index 2f74d20c..30d44609 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/viewmodel/TapMapViewModel.kt @@ -1,7 +1,10 @@ package com.paw.key.presentation.ui.course.entire.tab.map.viewmodel +import android.util.Log import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.kakao.vectormap.LatLng +import com.paw.key.core.util.PreferenceDataStore import com.paw.key.core.util.UiState import com.paw.key.presentation.ui.course.entire.tab.map.state.TapMapSideEffect import com.paw.key.presentation.ui.course.entire.tab.map.state.TapMapState @@ -10,7 +13,9 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -25,6 +30,19 @@ class TapMapViewModel @Inject constructor( val sideEffect: MutableSharedFlow get() = _sideEffect + private val savedRegion = PreferenceDataStore.getActiveRegion() + + fun loadInitialLocation() { + viewModelScope.launch { + Log.e("TapMapViewModel", "savedRegion: $savedRegion") + _state.update { + it.copy( + currentRegion = savedRegion.first() + ) + } + } + } + fun updateInitialLocationState(newState: UiState) { _state.value = _state.value.copy( initialLocationState = newState From fb0a1f7a8d3f5ff2029f5a6d0519f2c3de35b6c6 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:35:15 +0900 Subject: [PATCH 07/21] =?UTF-8?q?chore/#120:=20=ED=83=AD=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B7=B0=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/List/viewmodel/TapListViewModel.kt | 328 +++++++++--------- .../entire/tab/map/state/TapMapContract.kt | 2 + 2 files changed, 166 insertions(+), 164 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt index afe26214..55cab478 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/viewmodel/TapListViewModel.kt @@ -66,7 +66,7 @@ class TapListViewModel @Inject constructor( userId = userId.first(), request = request ).onSuccess { listEntity -> - val filteredPosts = listEntity.posts.filter { !it.isMine } + val filteredPosts = listEntity.posts//.filter { !it.isMine } println("응답 성공 - 내 게시물 제외된 posts 개수: ${filteredPosts.size}") _state.update { @@ -212,208 +212,208 @@ class TapListViewModel @Inject constructor( } -fun updateMood(option: String) { - _state.update { - it.copy( - selectedMood = if (it.selectedMood == option) "" else option - ) + fun updateMood(option: String) { + _state.update { + it.copy( + selectedMood = if (it.selectedMood == option) "" else option + ) + } } -} -fun updateDogFriend(option: String) { - _state.update { - it.copy( - selectedDogFriend = if (it.selectedDogFriend == option) "" else option - ) + fun updateDogFriend(option: String) { + _state.update { + it.copy( + selectedDogFriend = if (it.selectedDogFriend == option) "" else option + ) + } } -} - -fun updateSafety(option: String) { - _state.update { currentState -> - val newSafety = if (currentState.selectedSafety.contains(option)) { - currentState.selectedSafety.filter { it != option } - } else { - currentState.selectedSafety + option + + fun updateSafety(option: String) { + _state.update { currentState -> + val newSafety = if (currentState.selectedSafety.contains(option)) { + currentState.selectedSafety.filter { it != option } + } else { + currentState.selectedSafety + option + } + currentState.copy(selectedSafety = newSafety) } - currentState.copy(selectedSafety = newSafety) } -} - -fun updateConvenience(option: String) { - _state.update { currentState -> - val newConvenience = if (currentState.selectedConvenience.contains(option)) { - currentState.selectedConvenience.filter { it != option } - } else { - currentState.selectedConvenience + option + + fun updateConvenience(option: String) { + _state.update { currentState -> + val newConvenience = if (currentState.selectedConvenience.contains(option)) { + currentState.selectedConvenience.filter { it != option } + } else { + currentState.selectedConvenience + option + } + currentState.copy(selectedConvenience = newConvenience) } - currentState.copy(selectedConvenience = newConvenience) } -} - -fun updateEnvironment(option: String) { - _state.update { currentState -> - val newEnvironment = if (currentState.selectedEnvironment.contains(option)) { - currentState.selectedEnvironment.filter { it != option } - } else { - currentState.selectedEnvironment + option + + fun updateEnvironment(option: String) { + _state.update { currentState -> + val newEnvironment = if (currentState.selectedEnvironment.contains(option)) { + currentState.selectedEnvironment.filter { it != option } + } else { + currentState.selectedEnvironment + option + } + currentState.copy(selectedEnvironment = newEnvironment) } - currentState.copy(selectedEnvironment = newEnvironment) } -} - -fun toggleTimeExpanded() { - _state.update { it.copy(isTimeExpanded = !it.isTimeExpanded) } -} - -fun toggleMoodExpanded() { - _state.update { it.copy(isMoodExpanded = !it.isMoodExpanded) } -} - -fun toggleDogFriendExpanded() { - _state.update { it.copy(isDogFriendExpanded = !it.isDogFriendExpanded) } -} - -fun toggleSafetyExpanded() { - _state.update { it.copy(isSafetyExpanded = !it.isSafetyExpanded) } -} - -fun toggleConvenienceExpanded() { - _state.update { it.copy(isConvenienceExpanded = !it.isConvenienceExpanded) } -} - -fun toggleEnvironmentExpanded() { - _state.update { it.copy(isEnvironmentExpanded = !it.isEnvironmentExpanded) } -} - -fun resetAllOptions() { - _state.update { currentState -> - currentState.copy( - selectedSortOption = "", - selectedMood = "", - selectedDogFriend = "", - selectedSortTime = "", - selectedSafety = emptyList(), - selectedConvenience = emptyList(), - selectedEnvironment = emptyList(), - isMoodExpanded = false, - isDogFriendExpanded = false, - isSafetyExpanded = false, - isConvenienceExpanded = false, - isEnvironmentExpanded = false, - isTimeExpanded = false - ) + + fun toggleTimeExpanded() { + _state.update { it.copy(isTimeExpanded = !it.isTimeExpanded) } + } + + fun toggleMoodExpanded() { + _state.update { it.copy(isMoodExpanded = !it.isMoodExpanded) } } - loadInitialPosts() -} -fun applyOptions() { - val currentState = _state.value + fun toggleDogFriendExpanded() { + _state.update { it.copy(isDogFriendExpanded = !it.isDogFriendExpanded) } + } - viewModelScope.launch { - _state.update { it.copy(isLoading = true) } + fun toggleSafetyExpanded() { + _state.update { it.copy(isSafetyExpanded = !it.isSafetyExpanded) } + } - try { - val selectedOptions = buildSelectedOptionsList(currentState) + fun toggleConvenienceExpanded() { + _state.update { it.copy(isConvenienceExpanded = !it.isConvenienceExpanded) } + } - val request = PostsListRequestDto( - durationStart = state.value.selectedSortTimeStart, - durationEnd = state.value.selectedSortTimeEnd, - selectedOptions = selectedOptions.ifEmpty { null } + fun toggleEnvironmentExpanded() { + _state.update { it.copy(isEnvironmentExpanded = !it.isEnvironmentExpanded) } + } + + fun resetAllOptions() { + _state.update { currentState -> + currentState.copy( + selectedSortOption = "", + selectedMood = "", + selectedDogFriend = "", + selectedSortTime = "", + selectedSafety = emptyList(), + selectedConvenience = emptyList(), + selectedEnvironment = emptyList(), + isMoodExpanded = false, + isDogFriendExpanded = false, + isSafetyExpanded = false, + isConvenienceExpanded = false, + isEnvironmentExpanded = false, + isTimeExpanded = false ) + } + loadInitialPosts() + } - postsListRepository.postList( - userId = userId.first(), - request = request - ).onSuccess { listEntity -> - _state.update { - it.copy( - isLoading = false, - postsResult = listEntity - ) + fun applyOptions() { + val currentState = _state.value + + viewModelScope.launch { + _state.update { it.copy(isLoading = true) } + + try { + val selectedOptions = buildSelectedOptionsList(currentState) + + val request = PostsListRequestDto( + durationStart = state.value.selectedSortTimeStart, + durationEnd = state.value.selectedSortTimeEnd, + selectedOptions = selectedOptions.ifEmpty { null } + ) + + postsListRepository.postList( + userId = userId.first(), + request = request + ).onSuccess { listEntity -> + _state.update { + it.copy( + isLoading = false, + postsResult = listEntity + ) + } + println("필터링된 게시물 로드 성공: ${listEntity.posts.size}개") + }.onFailure { exception -> + _state.update { it.copy(isLoading = false) } + exception.printStackTrace() + println("필터링된 게시물 로드 실패: ${exception.message}") } - println("필터링된 게시물 로드 성공: ${listEntity.posts.size}개") - }.onFailure { exception -> + } catch (e: Exception) { _state.update { it.copy(isLoading = false) } - exception.printStackTrace() - println("필터링된 게시물 로드 실패: ${exception.message}") + e.printStackTrace() } - } catch (e: Exception) { - _state.update { it.copy(isLoading = false) } - e.printStackTrace() } } -} -private fun buildSelectedOptionsList(state: TapListContract.TapListState): List { - val selectedOptions = mutableListOf() - val filterOptions = state.filterOptions ?: return emptyList() + private fun buildSelectedOptionsList(state: TapListContract.TapListState): List { + val selectedOptions = mutableListOf() + val filterOptions = state.filterOptions ?: return emptyList() - filterOptions.categoryList?.forEach { category -> - val selectedOptionIds = mutableListOf() + filterOptions.categoryList?.forEach { category -> + val selectedOptionIds = mutableListOf() - when (category.categoryName) { - "분위기" -> { - if (state.selectedMood.isNotEmpty()) { - category.categoryOptions?.find { it.categoryOptionText == state.selectedMood } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + when (category.categoryName) { + "분위기" -> { + if (state.selectedMood.isNotEmpty()) { + category.categoryOptions?.find { it.categoryOptionText == state.selectedMood } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "강아지 친구" -> { - if (state.selectedDogFriend.isNotEmpty()) { - category.categoryOptions?.find { it.categoryOptionText == state.selectedDogFriend } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "강아지 친구" -> { + if (state.selectedDogFriend.isNotEmpty()) { + category.categoryOptions?.find { it.categoryOptionText == state.selectedDogFriend } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "안전" -> { - state.selectedSafety.forEach { selectedSafety -> - category.categoryOptions?.find { it.categoryOptionText == selectedSafety } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "안전" -> { + state.selectedSafety.forEach { selectedSafety -> + category.categoryOptions?.find { it.categoryOptionText == selectedSafety } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "편의성" -> { - state.selectedConvenience.forEach { selectedConvenience -> - category.categoryOptions?.find { it.categoryOptionText == selectedConvenience } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "편의성" -> { + state.selectedConvenience.forEach { selectedConvenience -> + category.categoryOptions?.find { it.categoryOptionText == selectedConvenience } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } - } - "환경" -> { - state.selectedEnvironment.forEach { selectedEnvironment -> - category.categoryOptions?.find { it.categoryOptionText == selectedEnvironment } - ?.let { selectedOptionIds.add(it.categoryOptionId) } + "환경" -> { + state.selectedEnvironment.forEach { selectedEnvironment -> + category.categoryOptions?.find { it.categoryOptionText == selectedEnvironment } + ?.let { selectedOptionIds.add(it.categoryOptionId) } + } } } - } - if (selectedOptionIds.isNotEmpty()) { - selectedOptions.add( - TraitList( - categoryId = category.categoryId, - optionIds = selectedOptionIds + if (selectedOptionIds.isNotEmpty()) { + selectedOptions.add( + TraitList( + categoryId = category.categoryId, + optionIds = selectedOptionIds + ) ) - ) + } } + + return selectedOptions + } + + fun isAllOptionsSelected(): Boolean { + val currentState = _state.value + return currentState.selectedSortOption.isNotEmpty() || + currentState.selectedMood.isNotEmpty() || + currentState.selectedDogFriend.isNotEmpty() || + currentState.selectedSafety.isNotEmpty() || + currentState.selectedConvenience.isNotEmpty() || + currentState.selectedEnvironment.isNotEmpty() } - return selectedOptions -} - -fun isAllOptionsSelected(): Boolean { - val currentState = _state.value - return currentState.selectedSortOption.isNotEmpty() || - currentState.selectedMood.isNotEmpty() || - currentState.selectedDogFriend.isNotEmpty() || - currentState.selectedSafety.isNotEmpty() || - currentState.selectedConvenience.isNotEmpty() || - currentState.selectedEnvironment.isNotEmpty() -} - -fun isFilterApplied(): Boolean { - return isAllOptionsSelected() -} + fun isFilterApplied(): Boolean { + return isAllOptionsSelected() + } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt index d205012e..fea2cee1 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/state/TapMapContract.kt @@ -10,6 +10,8 @@ data class TapMapState( val currentLocation: LatLng? = null, val isLocationTracking: Boolean = false, val isTrackingEnabled: Boolean = false, + + val currentRegion : String? = null, ) sealed class TapMapSideEffect { From e8a29265e69c314cc4a2788c65c07e300e2a9580 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:35:44 +0900 Subject: [PATCH 08/21] =?UTF-8?q?chore/#120:=20progress=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/course/entire/tab/map/List/TabListScreen.kt | 1 + .../com/paw/key/presentation/ui/signup/SignUpDogScreen.kt | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt index e65daf4e..3e580bb8 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/entire/tab/map/List/TabListScreen.kt @@ -159,6 +159,7 @@ fun TabListScreen( descriptionTags = post.descriptionTags, postId = post.postId, createdAt = post.createdAt, + isMine = post.isMine, isLiked = post.isLike, onClickItem = { navigateToDetail(post.postId, post.routeId) diff --git a/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt index dc71f9e3..cdefe00d 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/signup/SignUpDogScreen.kt @@ -81,7 +81,7 @@ fun SignUpDogRoute( ) { val actualViewModel = viewModel ?: hiltViewModel() SignUpDogScreen( - step = 0.75F, + progress = 0.75F, navigateNext = navigateNext, modifier = modifier, viewModel = actualViewModel @@ -99,7 +99,6 @@ private fun isAgeValid(ageKnown: SignUpContract.AgeKnown, dogAge: String): Boole @RequiresApi(Build.VERSION_CODES.TIRAMISU) @Composable fun SignUpDogScreen( - step: Float, navigateNext: () -> Unit, modifier: Modifier = Modifier, progress: Float = 1F, @@ -192,7 +191,6 @@ fun SignUpDogScreen( Box( modifier = modifier .fillMaxSize() - .imePadding() ) { Column(modifier = Modifier.fillMaxSize()) { // 헤더 From a9adf0c768fe8021c0ed8f0038ae8c20a52fc675 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:36:26 +0900 Subject: [PATCH 09/21] =?UTF-8?q?chore/#120:=20=EA=B3=B5=EC=9C=A0=20?= =?UTF-8?q?=EC=82=B0=ED=83=9D=20=EB=A6=AC=EB=B7=B0=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20nullable=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/sharedwalk/SharedWalkService.kt | 2 +- .../review/viewmodel/SharedWalkReviewViewModel.kt | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt b/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt index 2a62d638..554355a7 100644 --- a/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt +++ b/app/src/main/java/com/paw/key/data/service/sharedwalk/SharedWalkService.kt @@ -20,5 +20,5 @@ interface SharedWalkService { suspend fun postSharedWalkReview( @Header("X-USER-ID") userId: Int, @Body reviewDto: SharedWalkReviewRequestDto - ) : BaseResponse + ) : BaseResponse } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt index 72ecd8d7..3ad85131 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/viewmodel/SharedWalkReviewViewModel.kt @@ -40,16 +40,16 @@ class SharedWalkReviewViewModel @Inject constructor( viewModelScope.launch { val categoryList = state.value.categoryList.map { category -> SharedWalkReviewCategory( - categoryId = category.categoryId, - selectedOptionIds = category.options.filter { it.isSelected }.map { it.optionId } + reviewCategoryId = category.categoryId, + selectedReviewOptionIds = category.options.filter { it.isSelected }.map { it.optionId } ) } val review = SharedWalkReviewEntity ( routeId = routeId, - categories = categoryList, + selectedReviewSetList = categoryList, ) - + Log.e("sharedWalkReview", "${routeId}, ${userId}") Log.d("SharedWalkReviewSideEffect", "리뷰 : $review") sharedRepository.postSharedWalkReviewRegister( userId = userId, @@ -124,11 +124,16 @@ class SharedWalkReviewViewModel @Inject constructor( } - fun onClickSharedReview() { + fun onClickSharedReview(userId: Int, routeId: Int) { _state.update { it.copy( isDialogVisible = true ) } + + postSharedWalkReview( + userId = userId, + routeId = routeId + ) } } \ No newline at end of file From 5bfce0b1cbd6b4ab4e9c8e5823025788157a5680 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:37:11 +0900 Subject: [PATCH 10/21] =?UTF-8?q?chore/#120:=20=EB=8B=A4=EC=9D=B4=EC=96=BC?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EB=90=98=EA=B3=A0=20=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=97=B0=EA=B2=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sharedwalk/SharedWalkRepositoryImpl.kt | 4 ++-- .../entity/sharedwalk/SharedWalkReviewEntity.kt | 12 ++++++------ .../repository/sharedwalk/SharedWalkRepository.kt | 2 +- .../sharedwalk/review/SharedWalkReviewScreen.kt | 13 +++++++++++-- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt b/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt index 219a3482..42b332cf 100644 --- a/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt +++ b/app/src/main/java/com/paw/key/data/repositoryimpl/sharedwalk/SharedWalkRepositoryImpl.kt @@ -17,9 +17,9 @@ class SharedWalkRepositoryImpl @Inject constructor( override suspend fun postSharedWalkReviewRegister( userId: Int, review: SharedWalkReviewEntity - ): Result { + ): Result { return runCatching { - sharedWalkDataSource.postSharedWalkReviewRegister(userId, review.toDto()) + sharedWalkDataSource.postSharedWalkReviewRegister(userId, review.toDto()).data } } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt b/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt index db684020..484915d0 100644 --- a/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt +++ b/app/src/main/java/com/paw/key/domain/model/entity/sharedwalk/SharedWalkReviewEntity.kt @@ -5,15 +5,15 @@ import com.paw.key.data.dto.request.sharedwalk.SharedWalkReviewRequestDto data class SharedWalkReviewEntity( val routeId: Int, - val categories: List + val selectedReviewSetList: List ) { fun toDto(): SharedWalkReviewRequestDto { return SharedWalkReviewRequestDto( routeId = routeId, - selectedCategories = categories.map { category -> + selectedReviewSetList = selectedReviewSetList.map { category -> SharedWalkReviewCategoryDto( - categoryId = category.categoryId, - selectedOptionIds = category.selectedOptionIds + reviewCategoryId = category.reviewCategoryId, + selectedReviewOptionIds = category.selectedReviewOptionIds ) } ) @@ -21,6 +21,6 @@ data class SharedWalkReviewEntity( } data class SharedWalkReviewCategory( - val categoryId: Int, - val selectedOptionIds: List + val reviewCategoryId: Int, + val selectedReviewOptionIds: List ) \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt b/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt index beb3f3e5..39a06bde 100644 --- a/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt +++ b/app/src/main/java/com/paw/key/domain/repository/sharedwalk/SharedWalkRepository.kt @@ -6,5 +6,5 @@ import com.paw.key.domain.model.entity.sharedwalk.SharedWalkReviewEntity interface SharedWalkRepository { suspend fun getSharedWalkTrack(userId: Int, routeId: Int): Result - suspend fun postSharedWalkReviewRegister(userId: Int, review: SharedWalkReviewEntity): Result + suspend fun postSharedWalkReviewRegister(userId: Int, review: SharedWalkReviewEntity): Result } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt index fb3beae6..0900c687 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/review/SharedWalkReviewScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource @@ -50,6 +51,7 @@ import com.paw.key.presentation.ui.course.walkreview.component.WalkReviewFeedbac import com.paw.key.presentation.ui.course.walkreview.component.WalkReviewImageRow import com.paw.key.presentation.ui.course.walkreview.component.WalkReviewInfoHolder import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) @Composable @@ -64,6 +66,7 @@ fun SharedWalkReviewRoute( isSharedWalk : Boolean = true ) { val state by viewModel.state.collectAsStateWithLifecycle() + val scope = rememberCoroutineScope() val isValid = state.isValidForm val userId = PreferenceDataStore.getUserId() @@ -103,7 +106,13 @@ fun SharedWalkReviewRoute( petName = state.petName, feedbackList = state.categoryList, onClickSharedReview = { - viewModel.onClickSharedReview() + // 다이얼로그용 + scope.launch { + viewModel.onClickSharedReview( + routeId = routeId, + userId = userId.first() + ) + } }, modifier = modifier, ) @@ -168,7 +177,7 @@ fun SharedWalkReviewScreen( feedbackList.forEachIndexed { index, category -> WalkReviewFeedbackForm( icon = R.drawable.ic_walk_review_location, - title = "${emoji[index]}${category.categoryDescription}", + title = "${emoji[index]} ${category.categoryDescription}", selectedFeedbackItems = category.options.filter { it.isSelected }.map { it.optionText }, feedbackList = category.options.map { it.optionText }, onClickFeedback = { selectedText -> From 3848050619b31808b0fa56ec9f3e0433427e6916 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:39:35 +0900 Subject: [PATCH 11/21] =?UTF-8?q?chore/#120:=20=EA=B3=B5=EC=9C=A0=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EB=A7=B5=20=EC=A7=80=EB=8F=84=20=EC=B9=B4?= =?UTF-8?q?=EB=A9=94=EB=9D=BC=20=EC=84=A4=EC=A0=95=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/datasource/sharedwalk/SharedWalkDataSource.kt | 2 ++ .../sharedroute/component/sharedCourseMapView.kt | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt b/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt index 769a9429..6c2aebf2 100644 --- a/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt +++ b/app/src/main/java/com/paw/key/data/remote/datasource/sharedwalk/SharedWalkDataSource.kt @@ -12,4 +12,6 @@ class SharedWalkDataSource @Inject constructor( suspend fun postSharedWalkReviewRegister(userId: Int, reviewDto: SharedWalkReviewRequestDto) = sharedWalkService.postSharedWalkReview(userId, reviewDto) + + } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt index 0a9ca4a2..6a13e05f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/sharedwalk/sharedroute/component/sharedCourseMapView.kt @@ -140,6 +140,14 @@ fun sharedWalkCourseMapView( } } + LaunchedEffect(poiPoints) { + kakaoMapState?.moveCamera( + CameraUpdateFactory.fitMapPoints( + poiPoints.toTypedArray(), 150, 15 + ) + ) + } + /*LaunchedEffect(poiPoints) { kakaoMapState?.let { map -> drawRouteOnMap(map, poiPoints) From a84941a4f352af24585cc5b4de78fd9c4fbb3c46 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:40:09 +0900 Subject: [PATCH 12/21] =?UTF-8?q?chore/#120:=20=EC=A0=80=EC=9E=A5=ED=95=9C?= =?UTF-8?q?=20=EA=B8=B0=EB=A1=9D=20=EB=B3=B4=EA=B8=B0=20=EB=B7=B0=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EA=B4=80=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/mypage/state/SavedDetailContract.kt | 5 +- .../mypage/viewmodel/SavedDetailViewModel.kt | 59 ++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt index 2f11eb74..e00f613e 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/SavedDetailContract.kt @@ -9,6 +9,7 @@ data class SavedDetailState( val routeId: Int = 0, val postTitle: String = "", val postContent: String = "", + val isPublic : Boolean = false, val isLiked: Boolean = false, val petName: String = "", val petProfileImage: String = "", @@ -19,5 +20,7 @@ data class SavedDetailState( val walkingImageUrls: List = emptyList(), val categoryTop3: List = emptyList(), - val totalReviewCount: Int = 0 + val totalReviewCount: Int = 0, + + val clickImage : String = "" ) \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt index 1ea68d45..4afa606a 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/SavedDetailViewModel.kt @@ -1,16 +1,73 @@ package com.paw.key.presentation.ui.mypage.viewmodel +import android.util.Log import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.paw.key.domain.repository.walklist.WalkListRepository import com.paw.key.presentation.ui.mypage.state.SavedDetailState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class SavedDetailViewModel @Inject constructor() : ViewModel() { +class SavedDetailViewModel @Inject constructor( + private val walkListDetailRepository: WalkListRepository +) : ViewModel() { private val _state = MutableStateFlow(SavedDetailState()) val state: StateFlow get() = _state.asStateFlow() + + fun onClickImage(imageUrl: String) { + _state.update { + it.copy( + clickImage = imageUrl + ) + } + } + + fun getWalkDetail(userId: Int, postId: Int) { + viewModelScope.launch { + walkListDetailRepository.getWalkListDetail(userId, postId) + .onSuccess { result -> + _state.update { + it.copy( + postTitle = result.title, + petName = result.authorInfo.petName, + createdAt = result.createdAt, + regionName = result.regionName, + categorySummary = result.categoryTags.categoryOptionSummary, + routeMapImageUrl = result.routeMapImageUrl, + walkingImageUrls = result.walkingImageUrls, + postContent = result.content, + petProfileImage = result.authorInfo.petProfileImage, + ) + } + } + .onFailure { + Log.e("getWalkDetail", "getWalkDetail: ${it.message}") + } + } + } + + fun getWalkTopPopular(userId: Int, routeId : Int) { + viewModelScope.launch { + walkListDetailRepository.getWalkTopPopular(userId, routeId) + .onSuccess { result -> + _state.update { + it.copy( + categoryTop3 = result.categoryTop3, + totalReviewCount = result.totalReviewCount + ) + } + Log.d("getWalkTopPopular", "getWalkTopPopular: ${result.categoryTop3}") + } + .onFailure { + Log.e("getWalkTopPopular", "getWalkTopPopular: 실패ㅐㅐ") + } + } + } } \ No newline at end of file From fe463be0637652bb79770c41437763db1dd4fb1e Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:40:48 +0900 Subject: [PATCH 13/21] =?UTF-8?q?feat/#120:=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=EC=99=80=20=EC=A0=80=EC=9E=A5=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EB=B3=B4=EA=B8=B0=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/navigation/SavedCourseNavigation.kt | 13 +++++++++---- .../mypage/navigation/SavedDetailNavigation.kt | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt index ad79c1a0..1f3d1208 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedCourseNavigation.kt @@ -8,12 +8,13 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.toRoute import com.paw.key.core.navigation.Route import com.paw.key.presentation.ui.mypage.SavedCourseRoute import kotlinx.serialization.Serializable fun NavController.navigateSavedCourse( - navOptions: NavOptions? + navOptions: NavOptions?, ) { navigate(SavedCourse, navOptions) } @@ -21,14 +22,18 @@ fun NavController.navigateSavedCourse( fun NavGraphBuilder.savedCourseNavGraph( paddingValues: PaddingValues, navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, snackBarHostState: SnackbarHostState, modifier: Modifier = Modifier, ) { - composable { + composable { backStackEntry -> + val ids = backStackEntry.toRoute() + SavedCourseRoute( navigateUp = navigateUp, - navigateNext = navigateNext, + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, modifier = modifier ) } diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt index 09263024..00102bf9 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/SavedDetailNavigation.kt @@ -9,14 +9,17 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.toRoute import com.paw.key.core.navigation.Route import com.paw.key.presentation.ui.mypage.SavedCourseRoute import kotlinx.serialization.Serializable fun NavController.navigateSavedDetail( - navOptions: NavOptions? + navOptions: NavOptions?, + routeId : Int, + pageId : Int ) { - navigate(SavedDetail, navOptions) + navigate(SavedDetail(routeId, pageId), navOptions) } fun NavGraphBuilder.savedDetailNavGraph( @@ -25,14 +28,18 @@ fun NavGraphBuilder.savedDetailNavGraph( snackBarHostState: SnackbarHostState, modifier: Modifier = Modifier, ) { - composable { + composable { backStackEntry -> + val ids = backStackEntry.toRoute() + SavedDetailRoute( navigateUp = navigateUp, - navigateToWalk = navigateToWalk, + navigateToSharedWalk = navigateToWalk, + routeId = ids.routeId, + pageId = ids.pageId, modifier = modifier ) } } @Serializable -data object SavedDetail : Route \ No newline at end of file +data class SavedDetail(val routeId : Int, val pageId : Int) : Route \ No newline at end of file From 58654ea6dac2074a3e70e7e81f2716933bdab72c Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:41:32 +0900 Subject: [PATCH 14/21] =?UTF-8?q?chore/#120:=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=EC=99=80=20=EC=A0=80=EC=9E=A5=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EB=B3=B4=EA=B8=B0=20-=20gui=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/mypage/SavedCourseDetailScreen.kt | 195 ++++++++++-------- .../ui/mypage/SavedCourseListScreen.kt | 34 +-- 2 files changed, 134 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt index 550abb38..ed07ff70 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseDetailScreen.kt @@ -1,5 +1,7 @@ package com.paw.key.presentation.ui.mypage +import android.app.Activity +import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -11,33 +13,52 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf 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.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.paw.key.R import com.paw.key.core.designsystem.component.CourseDetail import com.paw.key.core.designsystem.component.ImageModal import com.paw.key.core.designsystem.component.PawkeyButton import com.paw.key.core.designsystem.component.TopBar import com.paw.key.core.designsystem.theme.PawKeyTheme import com.paw.key.core.designsystem.theme.White1 +import com.paw.key.core.util.PreferenceDataStore import com.paw.key.domain.model.entity.walklist.CategoryTop3Entity import com.paw.key.presentation.ui.mypage.viewmodel.SavedDetailViewModel +import kotlinx.coroutines.flow.first @Composable fun SavedDetailRoute( navigateUp: () -> Unit, - navigateToWalk: () -> Unit, + navigateToSharedWalk: () -> Unit, + routeId : Int, + pageId : Int, modifier: Modifier = Modifier, viewModel: SavedDetailViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() + val userId = PreferenceDataStore.getUserId() + + LaunchedEffect(Unit) { + Log.e("SavedDetailRoute", "userId: ${userId.first()}, pageId: $pageId") + viewModel.getWalkDetail(userId.first(), pageId) + viewModel.getWalkTopPopular(userId.first(), routeId) + } SavedCourseDetailScreen( title = state.postTitle, @@ -52,108 +73,115 @@ fun SavedDetailRoute( categoryTop3 = state.categoryTop3, totalReviewCount = state.totalReviewCount, walkingImageUrls = state.walkingImageUrls, + clickImage = state.clickImage, + + onClickImage = { + viewModel.onClickImage(it) + }, navigateUp = navigateUp, - navigateToWalk = navigateToWalk, + navigateToSharedWalk = navigateToSharedWalk, modifier = modifier ) } @Composable fun SavedCourseDetailScreen( - title : String, - petName : String, - date : String, - location : String, - isLike : Boolean, - content : String, - petProfileImage : String, - routeMapImageUrl : String, - categorySummary : List, - categoryTop3 : List, - totalReviewCount : Int, - walkingImageUrls : List, - + title: String, + petName: String, + date: String, + location: String, + isLike: Boolean, + content: String, + petProfileImage: String, + routeMapImageUrl: String, + categorySummary: List, + categoryTop3: List, + totalReviewCount: Int, + walkingImageUrls: List, + clickImage: String, navigateUp: () -> Unit, - navigateToWalk: () -> Unit, - modifier: Modifier = Modifier + navigateToSharedWalk: () -> Unit, + onClickImage: (String) -> Unit, + modifier: Modifier = Modifier, ) { var isImageExpanded by remember { mutableStateOf(false) } + val isLiked by remember { mutableStateOf(isLike) } + val view = LocalView.current + val statusBarColor = PawKeyTheme.colors.green500 + + val context = LocalContext.current + val window = (context as? Activity)?.window + val previousNavBarColor = remember { window?.navigationBarColor } - Column(modifier = Modifier.fillMaxSize()) { + DisposableEffect(Unit) { + window?.navigationBarColor = statusBarColor.toArgb() + + onDispose { + // 화면에서 벗어날 때 원래 색으로 복원 + previousNavBarColor?.let { + window?.navigationBarColor = it + } + } + } + + Column( + modifier = modifier + .fillMaxSize() + .background(color = White1) + ) { TopBar( - title = "내가 저장한 산책 루트", + title = "내가 기록한 산책 루트", onBackClick = navigateUp ) - Box( - modifier = Modifier.weight(1f) + LazyColumn( + modifier = modifier + .fillMaxSize() + .background(color = Color.Transparent) + .zIndex(2F) ) { - LazyColumn( - modifier = modifier - .fillMaxWidth() - .padding(16.dp) - .background(color = White1) - ) { - item { - CourseDetail( - title = title, - petName = petName, - date = date, - Icon = if(isLike) com.paw.key.R.drawable.ic_heart_default else com.paw.key.R.drawable.ic_heart_filled, - location = location, - onClickLike = {}, - content = content, - petProfileImage = petProfileImage, - routeMapImageUrl = routeMapImageUrl, - categorySummary = categorySummary, - categoryTop3 = categoryTop3, - totalReviewCount = totalReviewCount, - walkingImageUrls = walkingImageUrls, - onImageClick = { - isImageExpanded = true - } - ) - - } - - item { - Spacer(modifier = Modifier.height(16.dp)) + item { + CourseDetail( + title = title, + petName = petName, + date = date, + Icon = if(isLiked) R.drawable.ic_heart_default else R.drawable.ic_heart_filled, + location = location, + content = content, + onClickLike = {}, + petProfileImage = petProfileImage, + routeMapImageUrl = routeMapImageUrl, + categorySummary = categorySummary, + categoryTop3 = categoryTop3, + totalReviewCount = totalReviewCount, + walkingImageUrls = walkingImageUrls, + onImageClick = { + onClickImage(it) + isImageExpanded = true + } + ) - HorizontalDivider( - thickness = 8.dp, - color = PawKeyTheme.colors.gray50, - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 8.dp) - ) + Spacer(modifier = Modifier.height(36.dp)) - Spacer(modifier = Modifier.height(120.dp)) - } + PawkeyButton( + text = "해당 루트로 산책하기", + enabled = true, + onClick = navigateToSharedWalk, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .background(color = PawKeyTheme.colors.green500) + ) } - - - - PawkeyButton( - text = "해당 루트로 산책하기", - enabled = true, - onClick = { - navigateToWalk() - }, - modifier = Modifier - .fillMaxWidth() - .align(Alignment.BottomCenter) - .padding(top = 24.dp, start = 16.dp, end = 16.dp, bottom = 60.dp) - ) - } - - if (isImageExpanded) { - ImageModal( - imageUrl = routeMapImageUrl, - onDismiss = { isImageExpanded = false } - ) } } + if (isImageExpanded) { + ImageModal( + imageUrl = clickImage, + onDismiss = { isImageExpanded = false } + ) + } } @@ -203,7 +231,10 @@ fun SavedCourseDetailPreview() { "https://pawkey-server.com/etc2.jpg" ), navigateUp = {}, - navigateToWalk = {} + navigateToSharedWalk = {}, + onClickImage = { _ -> }, + modifier = Modifier, + clickImage = "" ) } } diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt index 3b74f016..8d10d936 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/SavedCourseListScreen.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.first @Composable fun SavedCourseRoute( navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, modifier: Modifier = Modifier, viewModel: SavedListViewModel = hiltViewModel() ) { @@ -36,10 +36,14 @@ fun SavedCourseRoute( SavedCourseListScreen( state = state.value, navigateUp = navigateUp, - navigateNext = navigateNext, - onClickLike = { - // Todo : postid 네비게이션 연결 - viewModel.toggleLike(postId = 28, isLiked = false) + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, + /*onClickLike = { + //viewModel.toggleLike(postId = , isLiked = false) + },*/ + onClickItem = { + //navigateNext(state.) }, modifier = modifier ) @@ -49,8 +53,8 @@ fun SavedCourseRoute( fun SavedCourseListScreen( state: SavedListState, navigateUp: () -> Unit, - navigateNext: () -> Unit, - onClickLike: () -> Unit, + navigateNext: (Int, Int) -> Unit, + onClickItem: () -> Unit, modifier: Modifier = Modifier ) { Column( @@ -80,10 +84,11 @@ fun SavedCourseListScreen( petProfileImageUrl = item.writer.petProfileImageUrl, descriptionTags = item.descriptionTags, isLiked = item.isLiked, - onClickItem = navigateNext, - onClickLike = { - onClickLike() - } + isPublic = item.isPublic, + isMine = item.isMine, + onClickItem = { + navigateNext(item.routeId, item.postId) + }, ) } } @@ -97,8 +102,11 @@ fun SavedCourseListScreenPreview() { SavedCourseListScreen( state = SavedListState(), navigateUp = {}, - navigateNext = {}, - onClickLike = {} + navigateNext = { _, _ -> + }, + onClickItem = {} + + //onClickLike = {} ) } } \ No newline at end of file From 4544d70ae863d04f8bea2d3c6399161454cb4473 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:44:50 +0900 Subject: [PATCH 15/21] =?UTF-8?q?chore/#120:=20=ED=8E=AB=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EB=B6=80=EB=B6=84=20=EB=B6=84=EA=B8=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/mypage/PetProfileScreen.kt | 39 ++++++++++++++----- .../mypage/viewmodel/PetProfileViewModel.kt | 3 +- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt index 025fa2c2..f2235975 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/PetProfileScreen.kt @@ -23,7 +23,9 @@ import coil.compose.AsyncImage import coil.request.ImageRequest import com.paw.key.core.designsystem.component.TopBar import com.paw.key.core.designsystem.theme.PawKeyTheme +import com.paw.key.core.util.PreferenceDataStore import com.paw.key.presentation.ui.mypage.viewmodel.PetProfileViewModel +import kotlinx.coroutines.flow.first @Composable fun PetProfileRoute( @@ -32,9 +34,10 @@ fun PetProfileRoute( viewModel: PetProfileViewModel = hiltViewModel() ) { val state = viewModel.state.collectAsStateWithLifecycle() + val userId = PreferenceDataStore.getUserId() LaunchedEffect(Unit) { - viewModel.getPetProfiles(2) + viewModel.getPetProfiles(userId.first()) } PetProfileScreen( @@ -43,6 +46,7 @@ fun PetProfileRoute( gender = state.value.gender, breed = state.value.breed, age = state.value.age, + isNeutered = state.value.isNeutered, energyLevel = state.value.energyLevel, socialLevel = state.value.socialLevel, navigateUp = navigateUp, @@ -59,6 +63,7 @@ fun PetProfileScreen( gender: String, breed: String, age: String, + isNeutered: Boolean, energyLevel: String, socialLevel: String ) { @@ -101,12 +106,22 @@ fun PetProfileScreen( PetProfileItem(label = "이름", value = name) PetProfileItem(label = "성별", value = displayGender) - Text( - text = "중성화했어요", - style = PawKeyTheme.typography.caption12Sb2, - color = PawKeyTheme.colors.gray300, - modifier = Modifier.padding(start = 16.dp, top = 8.dp, bottom = 8.dp) - ) + if (isNeutered) { + Text( + text = "중성화했어요", + style = PawKeyTheme.typography.caption12Sb2, + color = PawKeyTheme.colors.gray300, + modifier = Modifier.padding(start = 16.dp, top = 8.dp, bottom = 8.dp) + ) + } else { + Text( + text = "중성화했어요", + style = PawKeyTheme.typography.caption12Sb2, + color = PawKeyTheme.colors.gray300, + modifier = Modifier.padding(start = 16.dp, top = 8.dp, bottom = 8.dp) + ) + } + PetProfileItem(label = "견종", value = breed) PetProfileItem(label = "나이", value = age) @@ -166,7 +181,10 @@ fun PetProfileItem( label: String, value: String ) { - Column(modifier = Modifier.padding(start = 16.dp, bottom = 8.dp)) { + Column( + modifier = Modifier + .padding(start = 16.dp, bottom = 8.dp) + ) { Text( text = label, style = PawKeyTheme.typography.body14R, @@ -175,7 +193,7 @@ fun PetProfileItem( Text( text = value, style = PawKeyTheme.typography.head18Sb, - color = PawKeyTheme.colors.black + color = PawKeyTheme.colors.green500 ) } } @@ -192,7 +210,8 @@ fun PetProfileScreenPreview() { energyLevel = "활동적이에요", socialLevel = "불편해해요", imageUrl = null, - navigateUp = {} + navigateUp = {}, + isNeutered = true ) } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt index 6fc953bd..9804253a 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/viewmodel/PetProfileViewModel.kt @@ -42,7 +42,8 @@ class PetProfileViewModel @Inject constructor( breed = result.first().breed, age = result.first().age.toString(), energyLevel = result.first().traits.first().option, - socialLevel = result.first().traits.first().option + socialLevel = result.first().traits.first().option, + isNeutered = result.first().isNeutered ) } } From 80c4b4bd6abb48cf591a833540763caa5d143d33 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:45:37 +0900 Subject: [PATCH 16/21] =?UTF-8?q?chore/#120:=20noripple,=20state=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt | 3 ++- .../paw/key/presentation/ui/mypage/state/PetProfileContract.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt index f7f5d57a..aac4caff 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/MyPageScreen.kt @@ -30,6 +30,7 @@ import com.paw.key.R import com.paw.key.core.designsystem.component.SubChip import com.paw.key.core.designsystem.theme.PawKeyTheme import com.paw.key.core.util.PreferenceDataStore +import com.paw.key.core.util.noRippleClickable import com.paw.key.presentation.ui.mypage.component.GrayChip import com.paw.key.presentation.ui.mypage.state.MyPageState import com.paw.key.presentation.ui.mypage.viewmodel.MyPageViewModel @@ -149,7 +150,7 @@ fun OwnerCard( .fillMaxWidth() .background(Color.White, RoundedCornerShape(12.dp)) .padding(16.dp) - .clickable { navigateUserProfile() }, + .noRippleClickable { navigateUserProfile() }, verticalAlignment = Alignment.CenterVertically ) { diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt index eeddd514..e6aa2bdf 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/state/PetProfileContract.kt @@ -9,6 +9,7 @@ data class PetProfileState( val gender: String = "남아", val breed: String = "코리안 숏헤어", val age: String = "4세", + val isNeutered: Boolean = true, val energyLevel: String = "활동적이에요", val socialLevel: String = "불편해해요" ) From 2106f644505a484b40deda4618cb848f6dbe250b Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:46:04 +0900 Subject: [PATCH 17/21] =?UTF-8?q?feat/#120:=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=A0=84=EC=B2=B4=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../key/presentation/ui/main/MainNavigator.kt | 12 +++++++-- .../key/presentation/ui/main/PawKeyNavHost.kt | 26 +++++++++++-------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt b/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt index ce7a85c2..bb784688 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/main/MainNavigator.kt @@ -105,8 +105,16 @@ class MainNavigator( navController.navigateSavedCourse(navOptions = navOptions) } - fun navigateSavedDetail(navOptions: NavOptions? = null) { - navController.navigateSavedDetail(navOptions = navOptions) + fun navigateSavedDetail( + pageId: Int, + routeId: Int, + navOptions: NavOptions? = null) + { + navController.navigateSavedDetail( + pageId = pageId, + routeId = routeId, + navOptions = navOptions + ) } fun navigateSignUpFlow(navOptions: NavOptions? = null) { diff --git a/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt b/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt index 1f0b55aa..1c39591b 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/main/PawKeyNavHost.kt @@ -140,9 +140,9 @@ fun PawKeyNavHost( walkCompletionNavGraph( paddingValues = paddingValues, navigateUp = navigator::navigateUp, - navigateNext = { + navigateNext = { routeId -> navigator.navigateWalkReview( - routeId = it, + routeId = routeId, ) }, ) @@ -150,10 +150,10 @@ fun PawKeyNavHost( walkReviewNavGraph( navigateUp = navigator::navigateUp, navigateNext = navigator::navigateCourse, - navigateShared = { - navigator.navigateArchivedDetail( // Todo 새로 생성 시라 pageId 변경 - pageId = 0, - routeId = it + navigateShared = { routeId, pageId -> + navigator.navigateArchivedDetail( + pageId = pageId, + routeId = routeId ) }, snackBarHostState = snackbarHostState @@ -179,17 +179,21 @@ fun PawKeyNavHost( savedCourseNavGraph( paddingValues = paddingValues, navigateUp = navigator::navigateUp, - navigateNext = navigator::navigateSavedDetail, + navigateNext = { routeId, pageId -> + navigator.navigateSavedDetail( + pageId = pageId, + routeId = routeId + ) + }, snackBarHostState = snackbarHostState ) archivedCourseNavGraph( navigateUp = navigator::navigateUp, - navigateNext = { + navigateNext = { routeId, pageId -> navigator.navigateArchivedDetail( - // Todo : 내가 기록 저장한 리스트에서 상세정보 item id 넣어놓기 일단2 - pageId = 0, - routeId = 2 + pageId = pageId, + routeId = routeId ) }, modifier = modifier From 102e045c0991db71fec072ef5e7dd70f02a0e705 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:47:34 +0900 Subject: [PATCH 18/21] =?UTF-8?q?feat/#120:=20=ED=99=88=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=20=EC=A0=80=EC=9E=A5=20=ED=9B=84=20tabmap=EC=97=90=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/paw/key/presentation/ui/home/HomeScreen.kt | 1 + .../presentation/ui/home/viewmodel/HomeViewModel.kt | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt index 542eb0d3..ab68be4f 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/home/HomeScreen.kt @@ -185,6 +185,7 @@ fun HomeScreen( petProfileImageUrl = "", descriptionTags = listOf("2.2km"), isLiked = true, + isMine = true, onClickLike = { isLiked -> //onClickLike(post.postId, isLiked) }, diff --git a/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt b/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt index a56e27a0..17371a9a 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/home/viewmodel/HomeViewModel.kt @@ -154,7 +154,8 @@ class HomeViewModel @Inject constructor( val result = regionCurrentRepository.RegionCurrent(userId.first()) result.onSuccess { response -> Log.d("HomeViewModel", "RegionCurrent 성공: ${response.fullRegionName}") - + PreferenceDataStore.saveActiveRegion(response.fullRegionName) + Log.d("HomeViewModel", "activeRegion 저장 완료: ${response.fullRegionName}") _state.update { currentState -> currentState.copy( currentRegion = HomeContract.CurrentRegionInfo( @@ -167,13 +168,6 @@ class HomeViewModel @Inject constructor( ) ) } - try { - PreferenceDataStore.saveActiveRegion(response.fullRegionName) - Log.d("HomeViewModel", "activeRegion 저장 완료: ${response.fullRegionName}") - } catch (e: Exception) { - Log.e("HomeViewModel", "activeRegion 저장 실패: ${e.message}") - } - }.onFailure { exception -> Log.e("HomeViewModel", "RegionCurrent 실패: ${exception.message}") _state.update { currentState -> From 168e1b754dec6d080224c014435e07832dc3a038 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:48:16 +0900 Subject: [PATCH 19/21] =?UTF-8?q?chore/#120:=20course=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?,=20=EB=A7=B5=EB=B7=B0=20=EB=B6=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/designsystem/component/CourseCard.kt | 27 +++++++++++++++---- .../ui/course/walk/component/courseMapView.kt | 9 +++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt b/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt index f4266e60..ebd078b4 100644 --- a/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt +++ b/app/src/main/java/com/paw/key/core/designsystem/component/CourseCard.kt @@ -34,15 +34,16 @@ fun CourseCard( postId: Int, title: String, createdAt: String, + modifier: Modifier = Modifier, isLiked: Boolean? = null, // 저장한 루트에서만 사용 isPublic: Boolean? = null, // 기록한 루트에서만 사용 + isMine : Boolean, onClickItem: () -> Unit, onClickLike: ((Boolean) -> Unit)? = null, // null이면 클릭 불가 petName: String, - modifier: Modifier = Modifier, representativeImageUrl: String? = null, petProfileImageUrl: String? = null, - descriptionTags: List = emptyList() + descriptionTags: List = emptyList(), ) { fun formatDate(dateString: String): String { return try { @@ -57,7 +58,6 @@ fun CourseCard( modifier = modifier .padding(8.dp) .fillMaxWidth() - .size(width = 328.dp, height = 240.dp) .background(Color.White, shape = RoundedCornerShape(20.dp)) .noRippleClickable { onClickItem() } ) { @@ -128,6 +128,21 @@ fun CourseCard( .clip(CircleShape), contentScale = ContentScale.Crop ) + } else { + Box( + modifier = Modifier + .size(40.dp) + .clip(CircleShape) + .background(PawKeyTheme.colors.gray200), + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.ic_heart_default), + contentDescription = null, + tint = PawKeyTheme.colors.gray400, + modifier = Modifier.size(20.dp) + ) + } } Spacer(modifier = Modifier.width(10.dp)) @@ -197,7 +212,8 @@ fun CourseCard( HorizontalDivider( color = PawKeyTheme.colors.gray50, thickness = 1.dp, - modifier = Modifier.padding(horizontal = 16.dp) + modifier = Modifier + .padding(horizontal = 16.dp) ) } } @@ -216,7 +232,8 @@ fun CourseCardPreview() { petName = "후추", representativeImageUrl = "https://pawkey-server.com/image.jpg", petProfileImageUrl = "https://pawkey-server.com/profile.jpg", - descriptionTags = listOf("이륜차 거의 없음", "물그릇 비치", "쉴 곳 있음") + descriptionTags = listOf("이륜차 거의 없음", "물그릇 비치", "쉴 곳 있음"), + isMine = true ) } } \ No newline at end of file diff --git a/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt b/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt index 9c1b0b97..4d790049 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/course/walk/component/courseMapView.kt @@ -125,6 +125,15 @@ fun courseMapView( } } + + LaunchedEffect(poiPoints) { + kakaoMapState?.moveCamera( + CameraUpdateFactory.fitMapPoints( + poiPoints.toTypedArray(), 150, 15 + ) + ) + } + /*val fusedLocationClient = remember { LocationServices.getFusedLocationProviderClient(context) } val locationRequest = remember { From 3a2326ad17ac37fefdc7edd334c203182cce1796 Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:48:54 +0900 Subject: [PATCH 20/21] =?UTF-8?q?chore/#120:=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20-=20=EB=B7=B0=20?= =?UTF-8?q?=EB=84=98=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/paw/key/core/designsystem/component/ChipRow.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt b/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt index 475c9313..a86ffd41 100644 --- a/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt +++ b/app/src/main/java/com/paw/key/core/designsystem/component/ChipRow.kt @@ -3,6 +3,7 @@ package com.paw.key.core.designsystem.component import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -36,7 +37,7 @@ fun ChipRow( val hiddenCount = tags.size - 3 //가려진 칩 개수 FlowRow( - modifier = modifier, + modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { From ef50f35d51c00d26ee7ce5273aaa3a89d7decf4e Mon Sep 17 00:00:00 2001 From: sonms Date: Thu, 17 Jul 2025 22:50:28 +0900 Subject: [PATCH 21/21] =?UTF-8?q?feat/#120:=20=EA=B8=B0=EB=A1=9D=EB=90=9C?= =?UTF-8?q?=20course=20=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/mypage/ArchivedCourseListScreen.kt | 18 ++++++++++++------ .../navigation/ArchivedCourseNavigation.kt | 7 +++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt index d2abbd56..5181f982 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/ArchivedCourseListScreen.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.first @Composable fun ArchivedCourseRoute( navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, modifier: Modifier = Modifier, viewModel: ArchivedListViewModel = hiltViewModel() ) { @@ -36,7 +36,9 @@ fun ArchivedCourseRoute( ArchivedCourseListScreen( state = state.value, navigateUp = navigateUp, - navigateNext = navigateNext, + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, onClickLike = { postId, isLiked -> viewModel.toggleLike(postId = postId, isLiked = isLiked) }, @@ -48,7 +50,7 @@ fun ArchivedCourseRoute( fun ArchivedCourseListScreen( state: ArchivedListState, navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, onClickLike: (postId: Int, isLiked: Boolean) -> Unit, modifier: Modifier = Modifier ) { @@ -75,8 +77,11 @@ fun ArchivedCourseListScreen( descriptionTags = item.descriptionTags, isLiked = null, isPublic = item.isPublic, // 눈아이콘만 표시 - onClickItem = navigateNext, - onClickLike = null + onClickItem = { + navigateNext(item.routeId.toInt(), item.postId) + }, + onClickLike = null, + isMine = false ) } } @@ -90,7 +95,8 @@ fun ArchivedCourseListScreenPreview() { ArchivedCourseListScreen( state = ArchivedListState(), navigateUp = {}, - navigateNext = {}, + navigateNext = { _, _ -> + }, onClickLike = { _, _ -> } ) diff --git a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt index 76cc49ff..911f8636 100644 --- a/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt +++ b/app/src/main/java/com/paw/key/presentation/ui/mypage/navigation/ArchivedCourseNavigation.kt @@ -10,6 +10,7 @@ import com.paw.key.presentation.ui.mypage.ArchivedCourseRoute import kotlinx.serialization.Serializable fun NavController.navigateArchivedCourse( + navOptions: NavOptions? ) { navigate(ArchivedCourse, navOptions) @@ -17,13 +18,15 @@ fun NavController.navigateArchivedCourse( fun NavGraphBuilder.archivedCourseNavGraph( navigateUp: () -> Unit, - navigateNext: () -> Unit, + navigateNext: (Int, Int) -> Unit, modifier: Modifier = Modifier, ) { composable { ArchivedCourseRoute( navigateUp = navigateUp, - navigateNext = navigateNext, + navigateNext = { routeId, pageId -> + navigateNext(routeId, pageId) + }, modifier = modifier ) }