From 2456c897c3852cd47dcb3384b48eb292285b45fc Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 9 Aug 2023 21:20:09 +0900 Subject: [PATCH] =?UTF-8?q?=ED=99=88=20-=20=ED=95=98=EB=8B=A8=20=ED=83=AD?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets.xcassets/Tab/Contents.json | 6 + .../Contents.json | 21 +++ .../ic_tabbar_content_normal.png | Bin 0 -> 2511 bytes .../Contents.json | 21 +++ .../ic_tabbar_content_selected.png | Bin 0 -> 2992 bytes .../Contents.json | 21 +++ .../ic_tabbar_explorer_normal.png | Bin 0 -> 1177 bytes .../Contents.json | 21 +++ .../ic_tabbar_explorer_selected.png | Bin 0 -> 1160 bytes .../Contents.json | 21 +++ .../ic_tabbar_live_normal.png | Bin 0 -> 1141 bytes .../Contents.json | 21 +++ .../ic_tabbar_live_selected.png | Bin 0 -> 1104 bytes .../Contents.json | 21 +++ .../ic_tabbar_message_normal.png | Bin 0 -> 1045 bytes .../Contents.json | 21 +++ .../ic_tabbar_message_selected.png | Bin 0 -> 998 bytes .../Contents.json | 21 +++ .../ic_tabbar_my_normal.png | Bin 0 -> 928 bytes .../Contents.json | 21 +++ .../ic_tabbar_my_selected.png | Bin 0 -> 925 bytes .../Content/Main/ContentMainView.swift | 20 +++ SodaLive/Sources/Explorer/ExplorerView.swift | 20 +++ .../HomeView.swift => Live/LiveView.swift} | 10 +- .../Sources/Main/Home/BottomTabView.swift | 154 ++++++++++++++++++ SodaLive/Sources/Main/Home/HomeView.swift | 73 +++++++++ .../Sources/Main/Home/HomeViewModel.swift | 22 +++ SodaLive/Sources/Main/Home/TabButton.swift | 45 +++++ SodaLive/Sources/Message/MessageView.swift | 20 +++ SodaLive/Sources/MyPage/MyPageView.swift | 20 +++ 30 files changed, 595 insertions(+), 5 deletions(-) create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_normal.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_normal.imageset/ic_tabbar_content_normal.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_selected.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_selected.imageset/ic_tabbar_content_selected.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_normal.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_normal.imageset/ic_tabbar_explorer_normal.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_selected.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_selected.imageset/ic_tabbar_explorer_selected.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_normal.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_normal.imageset/ic_tabbar_live_normal.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_selected.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_selected.imageset/ic_tabbar_live_selected.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_normal.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_normal.imageset/ic_tabbar_message_normal.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_selected.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_selected.imageset/ic_tabbar_message_selected.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_normal.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_normal.imageset/ic_tabbar_my_normal.png create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_selected.imageset/Contents.json create mode 100644 SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_selected.imageset/ic_tabbar_my_selected.png create mode 100644 SodaLive/Sources/Content/Main/ContentMainView.swift create mode 100644 SodaLive/Sources/Explorer/ExplorerView.swift rename SodaLive/Sources/{Main/HomeView.swift => Live/LiveView.swift} (54%) create mode 100644 SodaLive/Sources/Main/Home/BottomTabView.swift create mode 100644 SodaLive/Sources/Main/Home/HomeView.swift create mode 100644 SodaLive/Sources/Main/Home/HomeViewModel.swift create mode 100644 SodaLive/Sources/Main/Home/TabButton.swift create mode 100644 SodaLive/Sources/Message/MessageView.swift create mode 100644 SodaLive/Sources/MyPage/MyPageView.swift diff --git a/SodaLive/Resources/Assets.xcassets/Tab/Contents.json b/SodaLive/Resources/Assets.xcassets/Tab/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/Tab/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_normal.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_normal.imageset/Contents.json new file mode 100644 index 0000000..7dcc9b8 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_normal.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_tabbar_content_normal.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_normal.imageset/ic_tabbar_content_normal.png b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_normal.imageset/ic_tabbar_content_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f9f9ef6302b0d0d5b92f56a5f92db9949fa698 GIT binary patch literal 2511 zcmV;=2{87FP)5x5yNU)5ptPn!R7zu%d>^4Y{ApyU@&)v(HFW2caQOAGecc>DJ4{}33003ifgc7e+WDjl!djWnuS)H3ULnwQeJcJ}VR zefz4sHBMJ5l{&4G3N_5yEysOM+XBjK+||7hR30$ixVFK5C}YhMj>X@eJb5z0fbTKj z60MR70rLU}LAw^Tn4{9oHTPfbSM%3SZ?bXlqDGK1&~Kf;>%Q%ur%#{CoTc^a*Z+9& z;>B_5C1BRvA1If;nrZBR0jPvf6r=&|X+&0v`;`TZU!nXdT{20cZ+04)B? z3+zLtDL1pCv@-DZC@Jv*0syfPG*BUM4P1WAix)3cn1+=y)h*~GVD{hPY*WlB7dzN4 zjPbzLFHr^*X^V0TK!JE`K;cA!u^dR14+TAW<;sz8l;4z%CpG)|B0Iw8)jL7hBt29NL#mV^$Cqy12SQ98Y|Lrkx7^0s7zsG zjJ2=b|D{#X?c29yD-_E(pYmH-WBc~)0vcV*MuD>NL*s=3*77KI0T{{Rq|tU{BC~!- zt0X?`XP}wiSsUis8PK7jArvlZH86AKll}aw)H;QLqhN#y0#UBnK*PMqB7FccV9U>W zt}Z!EWyRjTdp%po6Ix!vw1-n`wDe(=rhyfpZd&+z*Tjc>DFp1inzLwDqO*(4O?$8- zuM8fiN-3q*=%-@Bec1O!La+({`5=;05*JG{{ovrB<;MUoKG!A+1dmBkOQ9E;bdXrU znK#yI69e=CbolUL1@ZN+UAu_4Ap=76H!cWN*A>DfgbLzG5#XQDY+wtp(ZT^ERA5G( zP`O-|eOdS(-MMpTSpbu}K>;FMJL(af@7Zst<+*B-1KSl=FKD2 z0l5J41t0fj_?_=K=^uz(1ye=s!x)m0=G-Q~N2?TRw-7KdUXMkY3K;O40U)E3lao|L zV!{_LT##1|@yX`_Gdvd01tyv@>o|sFr3+%|S30rP%XXLBMLB# zae~t}K&7Zq!yH`hQXVL9K@*v9Fu*|Kpx`3YjRT&E#;P!E0=UR_Vzppf0={(VQk@s5 zDI*a>0mWub)bw#J=!=C%%@+%L2++P2?)s6z{*g^MnIm^f?XGxgu_gh82MLF61I*f# z1ptU3;ztztI@34KUsrvFq}1vHfL^_NHMeQgrb@Jhcnu-l%#Cu&MEVxYnHL!oI}Q{W0ZuW1B4oNI;K@@Ym)xJEss{&oX6 z6`bGzcF2TVlQI?u6)9{1XkUV*;1N^$Bm&>(HP4?qb*e@mflMcZ&Ye3qLygZO(riiu zpdEvb|MN$EGkDL9f6il1vibgtJ|cB;FD+l}*o>D>2c9`|rnF(hh6h~zLZc{!`*V}|qF>@azqs~uHr=`9<>fiP3}~D5 z_li0OEF}Lu!-~4cj1Rdkykm<06(Z&9vY$TU^4|<}_EQ2?>I$%s11;y-5ez^k+*7r# zmhgYMT<7}TvuDrN=rdB+fRzL|0~qD%S8SfyU6unVTbX=4$o?Ci`yYL7kZZI?YxLWp Zp8>YO!Zmogbsqo#002ovPDHLkV1kkY!P)=- literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_selected.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_selected.imageset/Contents.json new file mode 100644 index 0000000..7741146 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_selected.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_tabbar_content_selected.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_selected.imageset/ic_tabbar_content_selected.png b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_content_selected.imageset/ic_tabbar_content_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..607dd45ccca3865a5a3c604873e8346d15f1185e GIT binary patch literal 2992 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 literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_selected.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_selected.imageset/Contents.json new file mode 100644 index 0000000..7b4fa2f --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_selected.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_tabbar_explorer_selected.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_selected.imageset/ic_tabbar_explorer_selected.png b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_explorer_selected.imageset/ic_tabbar_explorer_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..aee34d2b9f6448e401c4b26bdd10e444a2b51a89 GIT binary patch literal 1160 zcmV;31b6$1P)tJp2SW=HJ@Zn;>>t_eC<2ecLL<(#fZB4T>iCCv5&XHVr^kUs4J`2MB+_qK(+W{TJnT@|Vwc;_R-treB0|WMeKTi8qE_Y)mgZlSQl`V)(3{ zp)lL@EpRZtAP`Q1dD4NUy3P*ItVODZKA>nhRMxb2wqXqf%i9o{*_cYo2m~ zpQ7{L3-C;;VA%+uGd8ZTdVXxsfoYbrwrWKyPr);(g0*GsnxG;C?Sh*D3p|r5_}1>M zF5sDoq}T>>5}rvFtSmQdg^NBB=XGswcesN8M|ug4+bif%pTIM8jxw7{F83dl2WdZ! zS*BT^oBdRDawuBrV|XUj!jCM^MpE=05HRpi4cqfRfP+jGEZaO~7rg{eaPZ_%v}_rf z1H>^r)6;2L0s^^c-J_Ld7qM-rk3*z=dJ5+AQDWxywLCd)-$7-s%Mf-fXCZiS1D#EO!%f7#>hgpAB4OSRcK4gId_ z_ia!=d1+bCTm4+y1Krl<6~D}}_S~oF%&|1r)(#RYT)_{r0!~bucPVIbXbR8w*WLVs z3w>=KB)uc4RMXLZdn4D$plz5nTeY0yUG%_ng;RWqjl5QWW9(jSO3x+ZS>-yfwvzV7 zbN^&1Sg!Fly}d0CiM;quc%Ge_GOtynG@X;#1W1wBFUPhB>XTTImVA&rmxGD+?RW-a z7@|i?un=1G$O#rgiXKV9LMYKAD_962dZYylzD19G)^bfmP|S^pvPXBV;Kb=K822Jg z>nQrjrLB9Dm+m3@7wccSv@`N+xE;%y7O``#FXr!^V8MtkQS^~mw%>mt_(NgwP9+^aRioBpVid zy8joP4!DvmIhJK+{F_OYT9Tu`p7h?c3{gQrLBT7cL^b~ z@cj>p{`B;8-}AgHN=R-5A0Hoc(SX2pl=YbAJ+#|dT3XsCL!1jfIXU6NgMeMOs7YV+ zxkR7l^78VzZl5ward%%jD9%j9GU!v|zL>O@ZXc(DJDpDJ@$pf6uo8Hcwsb{1ThiFG zykEaldIY%NM%=!3BDmY_Rv#W7x=EIC41-FgG6yd{lr?a&r0?$Td<$Zk+1uOOPpSr) zTbQkTe}8{T_E1_ma|^?|b+XIM&CN|iR_S6%e;~WSca`4DDl-?1!BojINK4M|D$ zXSIQ1NET5!#LNY+tgQ4gAdf7Imf<8UWgt3VahS0z`bt)jiQuE7BVTkq6un3(i-u$D z%j&EP<_82k5w%WFPi1*?FJ;jIe(yk5X*JV|J|N)x9+LYFK|3xMP=AJUh9&@$cZroV zC#$z+VNM}2(_8d%Fb$EVF+eU-u{7@SLsf6Z!Vo)yr=gxK9@?^WoOKy17Dm3jtqT5@ zEIq&^FUB=WT`)VT@E}e}%Ay0DoHSQgSFhq4rn;oDl;`p2*E8wEP7TYu8NIH%ym=X; zSmO{!8l-07@D!s>hH!2TOYcUn>sXp6>-zfoovzqXA4&l%W5SYR%gzg`yBOG4419>s zdbr&G`(1WqD4MW#@cjBSOLyqW(tMwN{Qtn@c=q4#(1h@S@Hpm+P9HI_J(##vJ%T^ zTR0}UFoyRlC;PUSa1<>IhuMx#>4@dGd~Hq%vlh$5T3D4_B!H8NO?csLa)eUwIBsI; zT?pc>5m|&B9pb{0EV(cu3^{8qmT(lQVBWW~gQKqVp1RbkIsIRig70a&*wn zr3IpM7jkqkdOQq8f1#(7!`y`&E416~iL$POf`WpA0y%#H{as#K@GW?X00000NkvXX Hu0mjfD;Ngv literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_selected.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_selected.imageset/Contents.json new file mode 100644 index 0000000..bedeed1 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_selected.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_tabbar_live_selected.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_selected.imageset/ic_tabbar_live_selected.png b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_live_selected.imageset/ic_tabbar_live_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..a4529c184d3fbae2958b63edf9828c1296aa422c GIT binary patch literal 1104 zcmV-W1h4yvP)Q^&;?NMAnpUI0MP^%K*a{2Y=DLhkg|g0 z5pl`zpL#5TnVF0)V;kg8avgbmnSaiiIcH`{R8vz^^AF)s#W?N@KDBUc@_C8q8ejNH z^rb;Gp5xdLybDT6Wduv19SGbJp;#@b^ttfpXm{YfqJ)$#SPE^!dM6ZGHVG40ya$V) z**?&q5_ti!O(Gwact^>_GOPS7-g9XCK&gU(4+~jWR)fdyuoYdJOT(2rXzd~8hgkBc zdw)T{E=4fJwjlOBrE_Bw(e!m7;9oLq| zRPnW`+=+#UeZlG7IcegdLrWX2%Q&$xW-I|2g1;k6Pv_xtMsgP{2dSM!_es$w@#`r? zvupHhRx@*TX}IKiGjwHZP=O)byQg>;pKRQFg2vhAxK0-2W?>$rP`Oh|2xN8BTACXR zbKebHu}p4)mqM|v_;m<6!|5*iR~v_Ny-A9;>Cu$D=zY$UB4ig0=6B{?EXA6{vwN6@iOY}80(UiA>T>k~PmNh#nh5+oOc zhPvX)fk}#u8c9duy`rQf7A)hVuS+iG3U`gfe%J3I3EmOJmgv2#gVG`r4O-m)=3z4M z(eT1E9BqUW9#Jo!xhlm%_PXK`cHyJFzmUPKQB4o(fF2jZ6XaygelM7oeL(Xo2qwpe3gI338 z<-!1moZeoA#4=h7XWZ80{<>8K7mj1H@CQmx6mmAID3&pf(!52|u>ZHB(nF37HgVWS zbR|NL4OXe8NpzJ$jt$niv_f>Dvz)w0Iz433Pw;aF7e0VhNA$nL`$kk#Q&Uq@VP)APgAViHR*dljKqGYwr$ z0&FFW@e;)#LxxnV)dPtAJ}0pZJEvHwR8A=dMjmFd5b9GxAjHoxu8+t7ZNa$1dF*PG zFs7olLYl`cpNJd)5q5ZeeXX4+wFJ*GK}qnCxlg&c(K$#g7(aaIkk|+WoTrt<#DY=w zosgU4If+V*MS>mmZiI(xvn$wP??&Xq*+Yp^Fee3vy&J(^ekn0j3Pw`M(*l4fv?CaI zZk-kYjzV6@sO%&j&XJ5#yWM`w8$K6=cE>8aPN$=?yQkOdOLCjW&d!c#=!pb}g@7{UCq#hqw=6Xl3Fc&g zF(RsG=M6uIL-+EN)LvX^A!K}VpglWAfLWxdbAVQ9iHv=OJK7{S;86B;yvt|_4m0*X zIWV3%l(8KAK$>VT9ylA~WSf+%Xk0>22pyn>(P}9YoltlO!{M-mhvi07Wvs`gS65d# zbpO9%EIp<9z@9zB4KI)(R^9+WN1}+`dt1NvA6V=K#J;8&SZM%YNmfJ#e-=JM4Z_VP zR>U&aJrag_9%255{`Q#Sp2wQlxEG>?#V;=}uOZ2-;|4s(pH}(RrRe_i1{w=|?(-?l1)lc!oenF_y9h~}cJ74J-M(}Mq=Rc+OD-2bqxt?~7GfEf zJp3nwQ5#zg;c;9L%u`sM7bYg9qArOEMzZ4FPh{a&re$JEN=iyf%7XJ7PNKNC>P+XX P00000NkvXXu0mjf&F|99 literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_selected.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_selected.imageset/Contents.json new file mode 100644 index 0000000..2197339 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_selected.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_tabbar_message_selected.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_selected.imageset/ic_tabbar_message_selected.png b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_message_selected.imageset/ic_tabbar_message_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab6c904e9dcdf98d5293bc5494b67d5917091cd GIT binary patch literal 998 zcmVKZB+@99)Knspmm>65mHkw0KEW&6Hrc&oB;ZW zXq)Aq#F0#BvtxT*ZzO+G@}DuThFK;Ad);?Q8JX0gcAMGMq< zY$Qz1IDi2^9}IyXJnwBqriTLYF8HWv>leUl3RuOz;?!_ZUH%Ct8hClioVP|9C9K#d21&c@j0K0tKL~-;PF)IxB0dkT{uz0lwd_~64O^M}ibzVfK zgB;Y5kq<5VoELw`&4?8Yz1%)*+CAhTlZQp@r9~Gd!9gFrjLbSRkXkUqcsUN^QpqYh zRY=Ek_6PyM)nJw3ojOsb5`2RRN`pk_o)kA}E>a7ocUKXP*a;)iX)aI;u8r5);E+P+ zkV#Z)uM!-ncPAKQ;a6~|-kl&`meoUJ>l7R(g$BaLa56v97&--C_}vT?hBv|70WD!Z zXvjv!Wu%$I4TTL@=XUM@_vOXYmS?*iC^%P)^)}oz6gDkx-J-;K#3WL`BH3x|n1isB zw4=>F5BFTj^Ae-Z%IPc{jfb6KLN9cuKU<&}rQLzcZs8icEM(pu&MO+hXD)-^S9Ckh z&Hu%K(#}lV(dNqUn}%!CFQ<*mfIE^tl=FBJig6RKox^T4j}vyyp}Y98aT};N%g8C1 z38Tv}P?v5cV)+L>Sc}Zeh;)Xub!5GOICY5?oPrqw-h0DEK*xO3*f|ADYm}mU2pj2W zs(RO|Wr<1S1YvW^{+4R$sRZ90XG>?wFA2+e7io=Ef+ZOYmGx{140tQ%qt;kmX>l%h zO#toLDa5<&G#8{QEm@pPAGnV&uyU6%jdz7qf+b@!fjvVQ^LaoAyhTb=RjQ}`QS z-**k-*<*(B8gk(Ekp~`j6FV!P;=PC!yn7@TF1J))VccWN`#avm<{gNWc#g~CO490m z#2>5MM32mjJCd_{W}^hPmGd!&B!vog;b<<%vM1TtOY?4mrcGN0eJOCZl{=s`gx0l` zg5ncfHIIuBD}?0XLPB_&5Clsx(c^2~$Af1sN)^nE`ICpIn;FZ*ii(Pgii$bsFRnTn U7jPse+yDRo07*qoM6N<$f{(eiw*UYD literal 0 HcmV?d00001 diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_normal.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_normal.imageset/Contents.json new file mode 100644 index 0000000..989c887 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_normal.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_tabbar_my_normal.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_normal.imageset/ic_tabbar_my_normal.png b/SodaLive/Resources/Assets.xcassets/Tab/ic_tabbar_my_normal.imageset/ic_tabbar_my_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..617e4629b3a09ac97a8144f41f7d7516628eecd7 GIT binary patch literal 928 zcmV;R17G}!P)XU}PxGi^X50Z;fw%&J;x$vs1)$kLa05xl1t@MnNfuzK6RLO!x}00 z83`gP4A~bXPm()85<*NE9n~}8=+3b4yH807F=3umkP?`z_)i#P?juryGlx4w5Dv>BG z;6V5@2_YuzrrbLchSNEnPWw-o!Q#C_vQg&fimsMKh21C@NeFa=uQQpE>8CSg=29+0+Cy`nAC8?u#LF87iYP~F6<)oSr@IBa9cDtY-lM6dDL6Uhbt zB751Ub;Zk&d4fL^a}BVp9-h?>>Pt=0zt^LCfNucTSP=A!#iGX8Z7>)P6xB|vUa!wx z2R-qm%)l@-S7RFKpvNYR!K8)sMm%97o&_uxL*sb};==n~4|p5s_Er!+$31l4t#2UQ z#dm(A<`YG}ISz(1p0bh@BEr}=p8OUT50hh2-d06p6CO_t?>5RkMnzqP@HZUY^jIGA zYTA{ZggIpq4c<3S()5HNNjmVvq>B0qWhe2igl7@ulLiQ%DQ&>tfoEl?Y?Ld0-my-m zP1#78pHZY2ei8_(BCFHPy0EK=p1f`v`ff0g*>o2w!mL|Mj0S=#QU z!U2_?vAOV}VuTMJBYfyYR=np>a0znT4F-eZKjsgWZ*TGKTVGoM0000iNx07gB4G`?%m3s7#rqoVBR z|LbnWG`8Kg-_&iHU$R-sc4p_d-^}jpHw6NLKp;?D9LB)wSZ04XEIC1$9~Zbq*`YHw z;5Y%k3Q%3Ix+Xm1RaixT0UH#G`Ej=2_t}`E3*ezoac{!UV=0&DjLT@|MObe8QPpk3 z10{Ii<)$pL;v)<$t2p+Et^HWG-~sapKZ|8y254Y(yhPemSjX&nDjUHDVYKgZOxIzA zX_wX;6zpUbcMW&~LrjGkjb#|a$5mNxfH1;L_(d%DU>n^wj^l0-Mwkg}B;bic3bUel z_#@IAA`GyMa0HKh&oNWWgO`a%kuekIIBUWqH~69f1I&au=|6=(nk!XTEMZcIC!As3 zX2R@p?_kvJI*`QSJ&Z6D)-K1H)*kF>uI;+w2`h|p6}C|p_Gi<#B~#%n%J*Re>w3Dn z>keUv`Eyub<=D`Xqry54SXTwcc$s))4c)|$-8)O@t-u3blX!fsi@2-ssxIX$a+0J; zygEEFmNc!3^F%SXJ4n;Ce~@&BR_FfEr)Zn82zQc2zBOI6nn48ufvbVnn^r9reQnf} zxb_2I{&8~2HfHNYmmMDO`D>PSA|6~NM2R!tmH;0?6kgzdp29czujubokV_{fXOeEG z6mGEKH~xLB4HI5~gco4l@B*0B#K#PnFn8CPchY513NK3fyd5?V)mlcS@IfN@#JZa* z&v`XQWuzKZw3IG>m34){SE^PM04mRZ{{|z94^^@qQFhnmQo0lpVLUY1;);rE#Mg!p zAE<4F`oNviOZn6yTxsXg+BgASta7lO;bv*7_zzA zhU6}o>(bOV1wRG1x$gTG zBRs7H;b|ubPdhU`j^&@A7LQ48dms=9Tw#6#w(S93lp~;@00000NkvXXu0mjf0FR*X literal 0 HcmV?d00001 diff --git a/SodaLive/Sources/Content/Main/ContentMainView.swift b/SodaLive/Sources/Content/Main/ContentMainView.swift new file mode 100644 index 0000000..91fc488 --- /dev/null +++ b/SodaLive/Sources/Content/Main/ContentMainView.swift @@ -0,0 +1,20 @@ +// +// ContentMainView.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import SwiftUI + +struct ContentMainView: View { + var body: some View { + Text("Content") + } +} + +struct ContentMainView_Previews: PreviewProvider { + static var previews: some View { + ContentMainView() + } +} diff --git a/SodaLive/Sources/Explorer/ExplorerView.swift b/SodaLive/Sources/Explorer/ExplorerView.swift new file mode 100644 index 0000000..0ed1db9 --- /dev/null +++ b/SodaLive/Sources/Explorer/ExplorerView.swift @@ -0,0 +1,20 @@ +// +// ExplorerView.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import SwiftUI + +struct ExplorerView: View { + var body: some View { + Text("Explorer") + } +} + +struct ExplorerView_Previews: PreviewProvider { + static var previews: some View { + ExplorerView() + } +} diff --git a/SodaLive/Sources/Main/HomeView.swift b/SodaLive/Sources/Live/LiveView.swift similarity index 54% rename from SodaLive/Sources/Main/HomeView.swift rename to SodaLive/Sources/Live/LiveView.swift index 62a16cb..9494c66 100644 --- a/SodaLive/Sources/Main/HomeView.swift +++ b/SodaLive/Sources/Live/LiveView.swift @@ -1,5 +1,5 @@ // -// HomeView.swift +// LiveView.swift // SodaLive // // Created by klaus on 2023/08/09. @@ -7,14 +7,14 @@ import SwiftUI -struct HomeView: View { +struct LiveView: View { var body: some View { - Text("Home View") + Text("Live") } } -struct HomeView_Previews: PreviewProvider { +struct LiveView_Previews: PreviewProvider { static var previews: some View { - HomeView() + LiveView() } } diff --git a/SodaLive/Sources/Main/Home/BottomTabView.swift b/SodaLive/Sources/Main/Home/BottomTabView.swift new file mode 100644 index 0000000..eb324f1 --- /dev/null +++ b/SodaLive/Sources/Main/Home/BottomTabView.swift @@ -0,0 +1,154 @@ +// +// BottomTabView.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import SwiftUI + +struct BottomTabView: View { + let width: CGFloat + @Binding var currentTab: HomeViewModel.CurrentTab + + var body: some View { + HStack(spacing: 0) { + let tabWidth = width / 5 + + TabButton( + title: "라이브", + action: { + if currentTab != .live { + currentTab = .live + } + }, + image: { + currentTab == .live ? + "ic_tabbar_live_selected" : + "ic_tabbar_live_normal" + }, + fontName: { + currentTab == .live ? + Font.bold.rawValue : + Font.medium.rawValue + }, + color: { + currentTab == .live ? + Color(hex: "9970ff") : + Color(hex: "909090") + }, + width: tabWidth + ) + + TabButton( + title: "콘텐츠", + action: { + if currentTab != .content { + currentTab = .content + } + }, + image: { + currentTab == .content ? + "ic_tabbar_content_selected" : + "ic_tabbar_content_normal" + }, + fontName: { + currentTab == .content ? + Font.bold.rawValue : + Font.medium.rawValue + }, + color: { + currentTab == .content ? + Color(hex: "9970ff") : + Color(hex: "909090") + }, + width: tabWidth + ) + + TabButton( + title: "탐색", + action: { + if currentTab != .explorer { + currentTab = .explorer + } + }, + image: { + currentTab == .explorer ? + "ic_tabbar_explorer_selected" : + "ic_tabbar_explorer_normal" + }, + fontName: { + currentTab == .explorer ? + Font.bold.rawValue : + Font.medium.rawValue + }, + color: { + currentTab == .explorer ? + Color(hex: "9970ff") : + Color(hex: "909090") + }, + width: tabWidth + ) + + TabButton( + title: "메시지", + action: { + if currentTab != .message { + currentTab = .message + } + }, + image: { + currentTab == .message ? + "ic_tabbar_message_selected" : + "ic_tabbar_message_normal" + }, + fontName: { + currentTab == .message ? + Font.bold.rawValue : + Font.medium.rawValue + }, + color: { + currentTab == .message ? + Color(hex: "9970ff") : + Color(hex: "909090") + }, + width: tabWidth + ) + + TabButton( + title: "마이", + action: { + if currentTab != .mypage { + currentTab = .mypage + } + }, + image: { + currentTab == .mypage ? + "ic_tabbar_my_selected" : + "ic_tabbar_my_normal" + }, + fontName: { + currentTab == .mypage ? + Font.bold.rawValue : + Font.medium.rawValue + }, + color: { + currentTab == .mypage ? + Color(hex: "9970ff") : + Color(hex: "909090") + }, + width: tabWidth + ) + } + .background(Color(hex: "111111")) + } +} + +struct BottomTabView_Previews: PreviewProvider { + static var previews: some View { + BottomTabView( + width: UIScreen.main.bounds.width, + currentTab: .constant(.live) + ) + } +} diff --git a/SodaLive/Sources/Main/Home/HomeView.swift b/SodaLive/Sources/Main/Home/HomeView.swift new file mode 100644 index 0000000..9484cd5 --- /dev/null +++ b/SodaLive/Sources/Main/Home/HomeView.swift @@ -0,0 +1,73 @@ +// +// HomeView.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import SwiftUI + +import Firebase +import Kingfisher + +struct HomeView: View { + + @StateObject var viewModel = HomeViewModel() + @StateObject var appState = AppState.shared + + private let liveView = LiveView() + private let explorer = ExplorerView() + private let messageView = MessageView() + private let contentView = ContentMainView() + + var body: some View { + GeometryReader { proxy in + ZStack(alignment: .bottom) { + VStack(spacing: 0) { + ZStack { + contentView + .frame(width: viewModel.currentTab == .content ? proxy.size.width : 0) + .opacity(viewModel.currentTab == .content ? 1.0 : 0.01) + + liveView + .frame(width: viewModel.currentTab == .live ? proxy.size.width : 0) + .opacity(viewModel.currentTab == .live ? 1.0 : 0.01) + + explorer + .frame(width: viewModel.currentTab == .explorer ? proxy.size.width : 0) + .opacity(viewModel.currentTab == .explorer ? 1.0 : 0.01) + + messageView + .frame(width: viewModel.currentTab == .message ? proxy.size.width : 0) + .opacity(viewModel.currentTab == .message ? 1.0 : 0.01) + + if viewModel.currentTab == .mypage { + MyPageView() + } + } + .padding(.bottom, appState.isShowPlayer ? 72 : 0) + + Spacer() + + BottomTabView(width: proxy.size.width, currentTab: $viewModel.currentTab) + + if proxy.safeAreaInsets.bottom > 0 { + Rectangle() + .foregroundColor(Color(hex: "111111")) + .frame(width: proxy.size.width, height: 15.3) + } + } + .onAppear { + + } + } + .edgesIgnoringSafeArea(.bottom) + } + } +} + +struct HomeView_Previews: PreviewProvider { + static var previews: some View { + HomeView() + } +} diff --git a/SodaLive/Sources/Main/Home/HomeViewModel.swift b/SodaLive/Sources/Main/Home/HomeViewModel.swift new file mode 100644 index 0000000..e723b1b --- /dev/null +++ b/SodaLive/Sources/Main/Home/HomeViewModel.swift @@ -0,0 +1,22 @@ +// +// HomeViewModel.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import Foundation +import Combine + +final class HomeViewModel: ObservableObject { + + private var subscription = Set() + + private let userRepository = UserRepository() + + enum CurrentTab: String { + case content, live, explorer, message, mypage + } + + @Published var currentTab: CurrentTab = .live +} diff --git a/SodaLive/Sources/Main/Home/TabButton.swift b/SodaLive/Sources/Main/Home/TabButton.swift new file mode 100644 index 0000000..cd198e2 --- /dev/null +++ b/SodaLive/Sources/Main/Home/TabButton.swift @@ -0,0 +1,45 @@ +// +// TabButton.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import SwiftUI + +struct TabButton: View { + + let title: String + let action: () -> Void + let image: () -> String + let fontName: () -> String + let color: () -> Color + let width: CGFloat + + var body: some View { + VStack(spacing: 3.3) { + Image(image()) + + Text(title) + .font(.custom(fontName(), size: 10)) + .foregroundColor(color()) + } + .frame(width: width) + .contentShape(Rectangle()) + .padding(.vertical, 13.3) + .onTapGesture { action() } + } +} + +struct TabButton_Previews: PreviewProvider { + static var previews: some View { + TabButton( + title: "라이브", + action: {}, + image: { "ic_tabbar_live_selected" }, + fontName: { Font.bold.rawValue }, + color: { Color(hex: "9970ff") }, + width: UIScreen.main.bounds.width / 4 + ) + } +} diff --git a/SodaLive/Sources/Message/MessageView.swift b/SodaLive/Sources/Message/MessageView.swift new file mode 100644 index 0000000..e117088 --- /dev/null +++ b/SodaLive/Sources/Message/MessageView.swift @@ -0,0 +1,20 @@ +// +// MessageView.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import SwiftUI + +struct MessageView: View { + var body: some View { + Text("Message") + } +} + +struct MessageView_Previews: PreviewProvider { + static var previews: some View { + MessageView() + } +} diff --git a/SodaLive/Sources/MyPage/MyPageView.swift b/SodaLive/Sources/MyPage/MyPageView.swift new file mode 100644 index 0000000..be2a68d --- /dev/null +++ b/SodaLive/Sources/MyPage/MyPageView.swift @@ -0,0 +1,20 @@ +// +// MyPageView.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// + +import SwiftUI + +struct MyPageView: View { + var body: some View { + Text("MyPage") + } +} + +struct MyPageView_Previews: PreviewProvider { + static var previews: some View { + MyPageView() + } +}