From 78d831de3018fe4b284df461ada60fa820856bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=95=ED=98=84?= Date: Sun, 12 Nov 2023 03:01:15 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Image:=20=EB=82=A0=EC=94=A8=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 3 +++ public/assets/weather/hailstone.png | Bin 0 -> 5373 bytes public/assets/weather/rainy.png | Bin 0 -> 5950 bytes public/assets/weather/snow.png | Bin 0 -> 5800 bytes public/assets/weather/storm.png | Bin 0 -> 5752 bytes public/assets/weather/sunny.png | Bin 0 -> 5960 bytes public/assets/weather/windy.png | Bin 0 -> 6922 bytes 7 files changed, 3 insertions(+) create mode 100644 public/assets/weather/hailstone.png create mode 100644 public/assets/weather/rainy.png create mode 100644 public/assets/weather/snow.png create mode 100644 public/assets/weather/storm.png create mode 100644 public/assets/weather/sunny.png create mode 100644 public/assets/weather/windy.png diff --git a/.eslintrc.js b/.eslintrc.js index bfd4b2e5..02040472 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -5,4 +5,7 @@ module.exports = { "plugin:prettier/recommended", "plugin:storybook/recommended", ], + rules: { + "react-hooks/exhaustive-deps": "off", + }, }; diff --git a/public/assets/weather/hailstone.png b/public/assets/weather/hailstone.png new file mode 100644 index 0000000000000000000000000000000000000000..3b08504cef5a3d906a114ab65d15a662c3aa0483 GIT binary patch literal 5373 zcmai2=QkXR(31P?O!LZm#!)Vr)rFG_pgEHps1;cgHxM8a%Y8)g9A!dQ&QCT!96e| z@nD+qy&peZPO~s-+K9A${`n-VPZk)<2Zu05Qa6iFsFk*mLczsqtm3Zfi)?&Q-q4an zFj+=oB7qFTUS_CBy;Kk40#pB9^e=?$Z7gmU9|l%ur`9y_dk^J(m3_C}=y$13&rtLX zRF@af;OBjm`|~zvJ1EynSRs~H)VeQ3L+s|w7kcAn&T&I63 zsy@`cEt$P!X>V*S2CFOzVcp1=H*4V0i40Dydj@aYJGxU(_V<6Q9uA; zAbw2|A~pWPf3Q+3Fr^mhMVs?zuT3F5o{a{14+;5yJi?}#9j;-|_+T137+#ED@p(Tea5q<&WN@X}C->Xi1KJJ!5D_6GF{@;Ha zCf zI3`TcxH5KtK|UJ>3ijt7{Njk>JrrBIL4^y(;Wfyo4ZZnR{%7{#0~6Z@mE&rag03X1 zgr<)s@an|GMEM|7QQh(s**RW)^RP5CBN2OKd5LoDriXO&<+Y|;`si__iOHO*Hg2D( zKI{?0v5VRoW#mqtvA(6+b7;>e=&(=9t~JX3!-%5+o1K0lW{zl5<7jb7l6^eI z9MZn@3eeIzOP7CrB6x&FFZ1(;u>D^OG*QHvNpwvA4`M%>^1VsVk02 z&33e}vC41S2L>}%d-TbC2zJ71M53u#k<_q8OJdi>2lDI)atsK=+Oy00OXkE0PvvlX5!6O6qV*VE&@Q^VkCDdAeKqlOnr zQMm)IM9uor@A`dh08`Z)fLDcTU+O`qe1Fke)r_Q z{<@0iPGfptoK30%kMhnu8wVSR#5J=ipeINwL7N{NwIQ`)_j7lSNY=FD&Y<-29o#6u#FoU+?32fs$Ije#o-Q_#%W5`Qh@o0+pcJTEGm8VINNn?GZdF zveyMA!wlQGnlXzzA}bzMa?ZFtqD5i0wdmx#vkoX}mY?Npl547<+iN*UA(# z`LzgNLhKL7R*SG0A|j2{{S>;)P;<`}oCV}?*~?pR*Dh(RB@lOtng@_b3&DwZ_&7jwI`jFYt?o%3J4=~S5kJ#q+PPi=nq}3fsTMN2P5!tUtlO_JV z-cHApd=gJj8cFu`Gma*4R=}9gP(Xalg;EbuBddK;8gz79lTX+0AOF^wN;qy~&3vZ&G?R^kuj(l|#XsTnp_@FVRGCsMWbaF$ z|8iwFJ5%Z~)P``5O51O6l}Mg2`;%5yw3kKmxS}I$`J+ENDU0K)4gDH>%)tSDWo^Fi zZw&c6D@b6lCvutxuODj89TU#JG|RHIr2`O-X@C#2(^bMHEC>a&j>43-bLt#nBxJuC(414}vqBkIm!z($fCMCQQrjDB@iXi)+I-bMhxze8dZ6CG;NcOVR zP%E>Z^Gto3ER`Cl`z7Quj4B4!F-*hoY~@008%387oCZEK}>Z$%@?Tj<;^Cy9R@|OOU{{7phJERgex0loX6& z)Q81}zeD!DUTwI4QS^g@$XpIy-2#LzbMNxBeEC$<`kE3O4lHMEWtHfih>scq-;D@_ z>kyZ3Jj>Iegc=MfJ0umA&>3+~CLbt@y{GM6&-&o!=W1*#5S2KyeZCQ+SN-Q@qjs+6 z&j_f2{I?ZZ%XGD%FkiCqLiuhZzM8Bcs^lC?yl)34oF&s9U0+M6pJKAQpeaC1LF|>X zI#MUm#jdKZaHM4dUmoAda>ycMG4%OTVjw#k5f6zR;MMj*i&{ z7DryU#+XlQntpk?RdVt_uI3LCd0%9ibToGl1rnaCGwY=%)5=7O#0{!{V>P!1G{HIJ z1a>%h1-xbo}9E zc)u)ookX<3=~K}cW&8cZO4Aj;aclj!-}Iu412?Kj{Wbt}(REEHhmOLa!w#2{f-i6Q z?UT6ldPgxLvKwC#!h*fkp`M^q1zONCOdtbh&89drlghHrpRl-S;k)_CyoRu>A_5e% zDc>zKGpk@&;T+*z#+O^I5i$XkEo&y$5v^Y}pO1`6xG8{7Lyl=8N}PLq zVf%AUKFhkT0zG!+xr;O*QSx(%P9GjhG_&k84w^&ToM1v}E~;erz^L)BOguW5#*3Gk zglbMvWfL)i2Att>QzG;>5fOM2Le$jMqiseQn$c=C`(Hzjb3Tq{0%>2&kc8|TUNEpe zMIBq-cmO?hR2$_l&J@eO@tFcuIBRHEq)0wp?yJHQRW3x5$eg1hr~NfE6TcV-ND{iL z;I$R7Ai_&X5Kb@N7PQtCfE#cil363g8 zc^WLEHdqIEiw7_Q60k`f`ic`N5p+P~B?9~Ll4|RV$PI}GlHEdJwJ;f^i1^_n$~p!y zXd|Q!Zu4i#H%6Mp=D|6tNoIazYMfD$z0wSU*5qs|&M_uUFk09PQDj){#p@TqdOYZ2 z6)8w5UEnUV zI{W!i0>M>2qACm@J{drmB3UdpnBE=hZ#+5}6W`Niuc~4v?JlIDQdtPd{%tn4;_*Y9 zDw-~Hw|*WMQJn=uNpCqFXww%oaDpWi*nUn=pEYf^?f4S%6dCh(L@bW(z3Ve`vcj4q zn$XI8$j|SPtj@dWqVxgZD8=#FvHRuN(aVjKXch@GwN?1%o9H60 zN^Y%i%M$cT&!4Ics$$*5b;L#j8HKM{Ldb_@g#!Evfe)?Kfg`3hcwb%=|jlCjm*)p z{=gwosNDw76TD7>i}eYNz7y67=Hl`@CS`j1&-E9FjFR9&$q@-xAKJ@^K*Y;vdPJFA zZ#4|^UD_x~-Qi2UO=Zn4*Gf3)SVn2K(lxx>nJvr_>ZQn4B-6ZlHr9;;RzJ+v&qC12 zbjr`FZTw!7^ScDWam%L5sgir+A5fBaAbjOSuMNfp&rr$NGEa!;CBSxuRD0zfdYT=Q zl2TBaY1TIpCLv^QuDaXPgu7NE-RwFBaIo?xvFugdO`Y0xmnq2G1aWZ(mT>$6x6Tdi zO2baOf5rr_acB4yN~jBvMrY}w=2D?u4T#JF7einH2uEfGsb8TTmHqhj4|H;?i0~<8 zENk~MT?E}@>PjH5n;mW3gIPl4{;3R5W1^mJtCqogf39}*b#I%2pHa0%PW6Xnn&Vzy znQkx4NLKnYBQf_8ffOZ(+0za@Ik2eA1;$1CIodT7AZd}NR*dj!OvGbo=34@*b6gSO zF)vABsNo@ssaLvHZ8_gfI2rlW-Egqq`wV8w8VBKHlTa|Ne=yd(-O2 z*hny2>_U$hMx;1mmt^=KWtHq#M+=R={c2!kx7i zKx_GacP!@{c@KNR;R@qIi>J-=$u<9;(q$;`{>NS0(dt|$WI6`|BThc9(wyc2FE&k?p+AbQDDncx(6Y+xml4JH{)&XC;GHgxa*sN$4cK1Yt@d1*aW>rgv1ab*EK zrk_1oM+>Wh50%JTA4Ri@>k1cmWj>q6o*F5GwENEx!A3>N@JV{A5(y>SD7=P>44uqy z1H2uR8FH8Uc?A;Z&icU(UcU8tb`(9jxg(1HWLhayZnN!j!dm(WTVsoGWaZ1?ue8`Q zT*?x4X$Q*tzto-xn-KRvw1&`cb`^3x!sp}+;gGb6BxdFcKQc9*f%8ma^SWw9BxF-M z{bl5*yNJ|yQts!Om@Lt(!4K)dk*Jk-=AF)q?v>IGU2 z5s6OD&dyF?Qc+!n$BOzXuDtDTjM36OnhZKoYM}aJP*{*@Luk>{=PZc1zxS^@5Q0ub zOEICDRTZ_qDDa4!X4nhJ-|tnRxvvg?nr>e09vo;^%}rdWL!tIDT_r3y*7VkGXvpXWn&m@e6s-SIO5to~<<9e(&vVgXyl_+exo)oL7436de^RjU}ce%5((l{G?6^&ft zqCNOzl4-)6P0QGRww2{xmDQO}^71k(#vv4$-|aG$F~Go6T8c=iY;k+LgV{MS-_E_Q z_PJ@G9PO0*gV_}8pVCAsoq8C(@8{sXCOW%wi@o0ZCTYq4Gs#0YO<%c7L9CP;?e0}a zc9+H%Nd7X)P8sI*)|sK3v_+erm}iuxINz(usM`6TCtA?KgxsLO4$Dgaw5RI7OG%Um zM?n)$y5&3~($g6&dkaI$d7iR=(lDu5Sp3lgw0TXLJXB=4p6|?V^;iZ@Df7H(-POD^ zaP{BW_=JRNkDuSm{cG_YPvM$=x2BmYm8l;Ss$bXN+(@`S>-PqT?T!TNeLe5~FU_Oq zbAXX#QLe)HdkH`#FupgF!IU{f7mJ-XUr5qoQS+|!UAow5tlHKrnD?bve&p7AzuqAq zc-U!VVrX5RQlo-IA9n254Qu_E?fJWSXklR-hx^^i5uAG|$1|JeA8)g}6hTDx0Cq_ z;ragF=bLlxy=Uf}`ML8m=O!X_)yYX1NN{j)$Tc-o_5Z2EKbQ~`{$qSI{iuHe^wuy% z;oy*h{tH~3LNwjKAudW^T^Xltl4GZPau6IGonU-Tu6!qO*IO1`@UQFQ0 z=t1po#I+|n&$vTg2``lQ5jNIg5tm&!d+FVQBDaOri#EaIttl9DSOHhh-29E?`gzxU}Lv4K^`gmyjK;Fvn=MYHhs*;xCx zZcF^7nx%r_`hI4-!32`@;7iXj#p9Gce2kIbI86cI6>ImY^Gq^z?3378ED%IFyJ#QhA8x<8xBta4;&$&(+BMbaG#NFb z2mx19PLRQg5H#JEOoE7p&9b7vqJjekLS{P^ITn;TwJ=8)yib?=Nlvz zXMYYXZBx6ram#K~GDIynicnJv_Dm&EI^1s%AcRd};J579)4E->?@EQ^wl;l{Nd+WV4MwWx48R^h`WiAeWrK|Ua z?65wTx8sn~k7XqoW<)RA0~IZGsMlaO?53eeWT*5wN=iNF> zAsea7RtjF5W8~uGDY}6^KA5=f#3P4&=&%oAZ=mMXkBlBMSiY6Rr$2tYWXYm^PIX@& zR1gS8JC!$F3^-&YMAwIk_M1IT@iL_^KggCUP{uM`Q<1lJ?+-BUC%4z%>a{zT;TiaL z0R}-9pAc`_u_Tp_J$5ET%}xW0cG>9e#6*u+*O~8=BGx^(?S-aqEfl~-6aLrPp8W;m z6ZDL1VsQ6LJfq5lrC=ou#Tcl#;T8q5cVKeHCvJH9U}uNcBD*r0K*fqWqa0!^xu|FJ zx0wL8xKEgg+(wBFX(Zyev=pT4&|3g4<5vx~xAEtiU`M!?Z^AeWR;G@^u&?dwLgvI{ zWS)|dkwKqzUXe-fqZCQp1Kgk?8dLeRVEXL6Z~z|!#n+Si-(#&2!$^yvamrv zxIp#~0H6P4Fg-OibkbWX;G;<%8RN=8G)-mlF$?rnMT+_}Q;R$tWB&Vhi4VhBu-Iyu zCPz4&V8AWP#K7PtF1W9>VktNPXO`V#&fO8Mk_J`S7C-p%9{dDo5JV@~hE20?%pZ6D z>GGQCsDzG=DiPfGDX+rjx)#>eDo+s-0L$5;%s-_q2$zrlHLup!U)NuQsl}Kyot73I z-4FQu$evCQm5+EZ=0S606*=`*l&I#pV*)sWWZWWl*hNthY+4Uvd0&kvc-D}f>zX{N z4Pko?yRw^atboTCICGbVpn=^t%(Em6*@mi5M6`tK1ZQMwKAH$e>oE^M9#wE(J{!b^ zJwZdsZDR+@ERIN}+1GsJj`st3x!o0{t!BxJnNOF7#~x|ma7M-~1+n=vaK~g^N=~OB z%vF7d`Y`5ZL*KGT!?Gqxvs!94qVTo!VW@DX$^2CUFZU5lk%)7n!?F6~VERoeWaY)Q zWJg_ecwE;qv@XyBUJKfrHO(~PeW-iN+YKn$D+=7fll`Vs@g>cSTi$>i9@lKX19-R_Kbh?Tz6KTwe<(JRYL_O zp9iJRd?gbIzq>t4`)6Sc)#G&Csbu=0wO{yxpPW5_@};&XoW8hr)E8;m%zKmiz zJ7_KMZv>24x}(Ctv#Sp47`g(Tt&qj~cFLTPCUByW*TOd%J?&ZaH^O2Xc7*#V9&ucKq$*(9ElHpRz<2>>)e|09oHYm z@jq1gkODQghyJ1Yzs?#}wOC!fPV2%iX$8JVBTGGFe)PS!D8qtQ!lUJSy^GDjlId5t z5hBzbS~CW_eQ(0!p4`G`>D58~E^M``%rrgRq~^Gylm`HZrsGD+rM^ZK92?6Dvgd+? zXA-EyGmSW|3VC>Z6Q__n<2ml*MM|<}PC9vEI{eatU2+ntr!(YAn=UwJxM@@Y370fx zoAv`jF+Cb;3RGgCN8FgotVf0n>`i)HtYt%uQ5>JKOM#+n>!$L^SonON$hB2OgwM%` z1*_lEvp9Yy>;-lwcz*&FY+kyYzi@wYCCm3lc74Y2e);T{jX|F)Z32J)Igr4RWT?7$fgT4}-h410ZBXd<;T$FB-# zZ0B8G;Lj>xb&$f~*RxHwXo5}FQvN7lSbQjK*O*wZX%J&vo52AcQJd9&wbRMRaVVwm zNYqqS%~CyKXaF7i#LeE$j#7aMUtk7%QM_`!z72l8)Q+NmhQ#n94YEFsu`gM8;snUh zP`N#ilk>5ySv>e1O+*sQD(-<`?r<}+>Eu6377-j6xWO!LD_Z;M8j~<;eY2&gRzrvU z34}fd4aP-2iTx2RL|$mGjEj$gIj;}IF55h;svaExc=M;$WRX62QADt=hG{VTVEN{6 zlFfWpLmCwt6>}3a9K%M^L+C|@e~X<+Yb@ICGje_z@AXQGFfh%?pd%WVMN)4Sv^iqJ zCjEdzTs4#GkF^G!+q><|&#{%imXTEY23fI2u8p3WQcs8{02Nftpj93!F(W^nd?5u3 z=a3lVx&w@!#I_BG(`4h3F0Y?&q-_Cq248+Lqf2Q8#IdF4`A#SO?NI-*!0}qS`j*6Qm8Bva_=S&Fe9ia^lJY%*0SI!f;7&(?G;A>J<06XbY{J#m5ApmREleQI z%p_9GciT1vS(B4NJjeY+^8Tm6@it~{1lt!-ZCy>UbD6D?Q2u6F1j2!GchPlj;F%EC z*{%e;7R^9pn_b1nZt_>Q{1ia45v{HT-c#a~fU$8yh{Av9@jnOF5CgX)Qx@eNh$qJk zsS8OQzgSn;ZXt&h)5;5N=5C@PZ8C{pN=%{{;)dORR!Mk6(Jx`oU5f+nN_C3l#eHeP&qy9iYi7u7u{F*{Y(hoA=HSF4sT zt-gUG?_2Pr=*JhlOhqqUz(g`L660=Z#;_xsQ2tx)b-To|5v@%Y@O1f}Dkx-k939^2 zFq$d%?>O1%Cx?eOMDcNprIoP^)IOo$P@@|PJ@GOP#}*ncRdATHf&YW$^c`i7!AEYr zLdGl88dc*lDPoIaf{Q*?#9~8Wj!pXF@{xv|1UzRjfC6LAL8~4U1L0L(^t+s5^?sdS zdFA4Z{BiP{P-$d~&eMp-e z=U^EU@|2_`HGGjmwlCk;M%n0qsiT^2M4hJ=0tZ;Sili2- zIyESEG~?eN>777fo9s{UK&pb+)zQ4ovIDoiX`y1-6+gaX%(EQmg* z{^WO5RB#5CPZ=fqk=XGgID&j1yY_O*Yrz(85mL!V=={OVeU%5h$q_pLGiCTDBk|C? z=hNeW`I)|@__apwcsSX)Ro3r`U~~hOAo?9nFlPF zO*%e$2EUV#px%=Hh4a18ck|aZPK@70D1=uU+?Sfwa%Xlus zy1YQH8+GmCrmL%{tV zl;pAm8)@*xJF}j5yBYcGyrdosj!KVw94pi2^rKKJt8cgOoG(|^NoV(kk@>ljtdi}z zYom+jFqJyB^rlGhAcY5@QLyJ*-sz96_Yx~Gl%VV_A9Y&AdV&2%+q22A6{c4KW_ZNM z7hM;@E2;L@HFawbJ=Hy4ws?j=gbh zwV+FDo~a+`vzdv%`SG1prcBP21fFm${{5gF)Bce;pctZ6QDWWTyQ?Vl`{i03NSPQj z`AUZ8diI_)^ymIG6dhYRRs|*RYul&joc_9k$7&A8{?hx5ICq`4a#W+|F?g}xt<-*n z7FGK7u8D?`=@jW*F&sc!D4CPxeN?X7-rJTCmes&)^J5TlD%CDgfV$sXX=Kc(W*U=D z29y0%U5W;~i%wj&UY%}VEM&zbtz&>gmGC0{1XSo+_e0iT(J?0$7M9O3+5Wi2@`$*C z8ScK^C<+P+Y1_YscXjEB6=4gW?atw-`;@v_7WB>{FcP{&=$ie9_*<`v#_zY|UG7ZJ z-yTn5RGf8=zDPLA1$M0wn&n*Y2d>UWuAYZ-qBg(D^qfC~jl$NG-_r`3AO(JmXh64IQ`Qt$om zVi`M$J^62oru4Vr*(v;Xe^MVpMe>Q^azY|ZhrvQEU6oQYc(-0A)YNYARnZAdTP;or z)=(NV?v!c_>w%0vT0h33;Hx!S>2tlsY7HjykxFg{`{G{yfvJbjj_zK4E5&ipxyyq2 zS6g|>m$~1&I#uF7F^e|tC=U+4?jIcEve%!^fm+kcw1kkO@nGx7`7hr4HGWxbZlkP+ zx~-O35`xiV?A(E?>A}nfGFC;abHC5t4s$6Oi|xF-zdL9NbDHTrO8j7z(a-%rA1il#Hdts1D8FzEM<{-D`V0{i8^yFn2Ql=0{<(~Gi{Pagm z?6XIjtoKag-^THrcgDltg?%G-OP_sD7ppzx6KJIKU3QK8>#$IFr(SH*(Ispe@INW? cTar5pCpBc9#WmgKzqlJmQ%zU3PT3~vKUpO+y8r+H literal 0 HcmV?d00001 diff --git a/public/assets/weather/snow.png b/public/assets/weather/snow.png new file mode 100644 index 0000000000000000000000000000000000000000..4976e1a399be9cb48c38da4b7ebfd0eddfc16795 GIT binary patch literal 5800 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 literal 0 HcmV?d00001 diff --git a/public/assets/weather/storm.png b/public/assets/weather/storm.png new file mode 100644 index 0000000000000000000000000000000000000000..8330761f5c42b7c76246b5d4a81654381276e5bb GIT binary patch literal 5752 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 literal 0 HcmV?d00001 From a408d04eccc96958cf194584091bf4564bc63aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=95=ED=98=84?= Date: Sun, 12 Nov 2023 03:07:34 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Feat:=20=EB=B2=94=EC=9A=A9=20=EC=85=80?= =?UTF-8?q?=EB=A0=89=ED=8A=B8=20=EB=B0=95=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/components/SelectBox.tsx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/shared/components/SelectBox.tsx diff --git a/src/shared/components/SelectBox.tsx b/src/shared/components/SelectBox.tsx new file mode 100644 index 00000000..dd438188 --- /dev/null +++ b/src/shared/components/SelectBox.tsx @@ -0,0 +1,26 @@ +interface SelectBoxProps extends React.HTMLAttributes { + options: string[]; + defaultLabel?: string; +} +/** + * @param options + * @returns SelectBox + * @description 셀렉트 박스 + */ +const SelectBox = (props: SelectBoxProps) => { + return ( + + ); +}; + +export default SelectBox; From 4ed3940095842306d7f9d5abc144d942cd711c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=95=ED=98=84?= Date: Sun, 12 Nov 2023 03:08:04 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Feat:=20=EB=82=A0=EC=94=A8=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/api/weather.ts | 82 +++++++++ src/create/WeatherBox/const.ts | 269 ++++++++++++++++++++++++++++ src/create/WeatherBox/helper.ts | 72 ++++++++ src/create/WeatherBox/index.tsx | 68 +++++++ src/create/WeatherBox/interfaces.ts | 46 +++++ 5 files changed, 537 insertions(+) create mode 100644 pages/api/weather.ts create mode 100644 src/create/WeatherBox/const.ts create mode 100644 src/create/WeatherBox/helper.ts create mode 100644 src/create/WeatherBox/index.tsx create mode 100644 src/create/WeatherBox/interfaces.ts diff --git a/pages/api/weather.ts b/pages/api/weather.ts new file mode 100644 index 00000000..684d29df --- /dev/null +++ b/pages/api/weather.ts @@ -0,0 +1,82 @@ +import axios from "axios"; +import { LOCATION_OBJECT } from "create/WeatherBox/const"; +import { getCorrectBaseTime } from "create/WeatherBox/helper"; +import { WeatherItem, WeatherResponse } from "create/WeatherBox/interfaces"; +import { isEmpty, isUndefined } from "lodash"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + const { date, locationCode } = req.query; + if (isEmpty(date) || isEmpty(locationCode)) return res.status(400).end(); + const { x, y } = LOCATION_OBJECT[locationCode as string]; + + const params = { + serviceKey: process.env.NEXT_PUBLIC_WEATHER_API_KEY ?? "", + numOfRows: "846", + pageNo: "1", + nx: x, + ny: y, + dataType: "JSON", + ...getCorrectBaseTime(), + }; + + const result = await axios.get( + "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst", + { params }, + ); + + const items = result.data.response.body.items.item as WeatherItem[]; + const newWeatherObject = items.reduce((acc, cur) => { + const date = cur.fcstDate; + if (isUndefined(acc[date])) { + acc[date] = { + TMP: Array(24), + SKY: Array(24), + PTY: Array(24), + }; + } + + switch (cur.category) { + case "TMP": + case "SKY": + case "PTY": + const time = Number(cur.fcstTime.slice(0, 2)); + acc[date][cur.category][time] = Number(cur.fcstValue); + break; + case "TMN": + case "TMX": + acc[date][cur.category] = Number(cur.fcstValue); + break; + } + return acc; + }, {} as WeatherResponse); + + res.json(newWeatherObject); +} + +/** + * + * 하늘상태(SKY) 코드 : 맑음(1), 구름많음(3), 흐림(4) + * 강수형태(PTY) 코드 : 없음(0), 비(1), 비/눈(2), 눈(3), 소나기(4) + * + * 단기예보 제공 시간대는 0200, 0500, 0800, 1100, 1400, 1700, 2000, 2300 + * API 제공 시간(~이후) : 02:10, 05:10, 08:10, 11:10, 14:10, 17:10, 20:10, 23:10 + * + * POP 강수확률 + * PTY 강수형태 + * PCP 1시간 강수량 + * REH 습도 + * SNO 1시간 신적설 + * SKY 하늘상태 + * TMP 1시간 기온 + * TMN 일 최저기온 + * TMX 일 최고기온 + * UUU 풍속(동서성분) + * VVV 풍속(남북성분) + * WAV 파고 + * VEC 풍향 + * WSD 풍속 + */ diff --git a/src/create/WeatherBox/const.ts b/src/create/WeatherBox/const.ts new file mode 100644 index 00000000..b099cf45 --- /dev/null +++ b/src/create/WeatherBox/const.ts @@ -0,0 +1,269 @@ +import { LocationProps } from "./interfaces"; + +export const BASE_TIMES = [ + "0200", + "0500", + "0800", + "1100", + "1400", + "1700", + "2000", + "2300", +]; +export const LOCATION_OBJECT: Record = { + "1111000000": { loc1: "서울특별시", loc2: "종로구", x: 60, y: 127 }, + "1114000000": { loc1: "서울특별시", loc2: "중구", x: 60, y: 127 }, + "1117000000": { loc1: "서울특별시", loc2: "용산구", x: 60, y: 126 }, + "1120000000": { loc1: "서울특별시", loc2: "성동구", x: 61, y: 127 }, + "1121500000": { loc1: "서울특별시", loc2: "광진구", x: 62, y: 126 }, + "1123000000": { loc1: "서울특별시", loc2: "동대문구", x: 61, y: 127 }, + "1126000000": { loc1: "서울특별시", loc2: "중랑구", x: 62, y: 128 }, + "1129000000": { loc1: "서울특별시", loc2: "성북구", x: 61, y: 127 }, + "1130500000": { loc1: "서울특별시", loc2: "강북구", x: 61, y: 128 }, + "1132000000": { loc1: "서울특별시", loc2: "도봉구", x: 61, y: 129 }, + "1135000000": { loc1: "서울특별시", loc2: "노원구", x: 61, y: 129 }, + "1138000000": { loc1: "서울특별시", loc2: "은평구", x: 59, y: 127 }, + "1141000000": { loc1: "서울특별시", loc2: "서대문구", x: 59, y: 127 }, + "1144000000": { loc1: "서울특별시", loc2: "마포구", x: 59, y: 127 }, + "1147000000": { loc1: "서울특별시", loc2: "양천구", x: 58, y: 126 }, + "1150000000": { loc1: "서울특별시", loc2: "강서구", x: 58, y: 126 }, + "1153000000": { loc1: "서울특별시", loc2: "구로구", x: 58, y: 125 }, + "1154500000": { loc1: "서울특별시", loc2: "금천구", x: 59, y: 124 }, + "1156000000": { loc1: "서울특별시", loc2: "영등포구", x: 58, y: 126 }, + "1159000000": { loc1: "서울특별시", loc2: "동작구", x: 59, y: 125 }, + "1162000000": { loc1: "서울특별시", loc2: "관악구", x: 59, y: 125 }, + "1165000000": { loc1: "서울특별시", loc2: "서초구", x: 61, y: 125 }, + "1168000000": { loc1: "서울특별시", loc2: "강남구", x: 61, y: 126 }, + "1171000000": { loc1: "서울특별시", loc2: "송파구", x: 62, y: 126 }, + "1174000000": { loc1: "서울특별시", loc2: "강동구", x: 62, y: 126 }, + "2611000000": { loc1: "부산광역시", loc2: "중구", x: 97, y: 74 }, + "2614000000": { loc1: "부산광역시", loc2: "서구", x: 97, y: 74 }, + "2617000000": { loc1: "부산광역시", loc2: "동구", x: 98, y: 75 }, + "2620000000": { loc1: "부산광역시", loc2: "영도구", x: 98, y: 74 }, + "2623000000": { loc1: "부산광역시", loc2: "부산진구", x: 97, y: 75 }, + "2626000000": { loc1: "부산광역시", loc2: "동래구", x: 98, y: 76 }, + "2629000000": { loc1: "부산광역시", loc2: "남구", x: 98, y: 75 }, + "2632000000": { loc1: "부산광역시", loc2: "북구", x: 96, y: 76 }, + "2635000000": { loc1: "부산광역시", loc2: "해운대구", x: 99, y: 75 }, + "2638000000": { loc1: "부산광역시", loc2: "사하구", x: 96, y: 74 }, + "2641000000": { loc1: "부산광역시", loc2: "금정구", x: 98, y: 77 }, + "2644000000": { loc1: "부산광역시", loc2: "강서구", x: 96, y: 76 }, + "2647000000": { loc1: "부산광역시", loc2: "연제구", x: 98, y: 76 }, + "2650000000": { loc1: "부산광역시", loc2: "수영구", x: 99, y: 75 }, + "2653000000": { loc1: "부산광역시", loc2: "사상구", x: 96, y: 75 }, + "2671000000": { loc1: "부산광역시", loc2: "기장군", x: 100, y: 77 }, + "2711000000": { loc1: "대구광역시", loc2: "중구", x: 89, y: 90 }, + "2714000000": { loc1: "대구광역시", loc2: "동구", x: 90, y: 91 }, + "2717000000": { loc1: "대구광역시", loc2: "서구", x: 88, y: 90 }, + "2720000000": { loc1: "대구광역시", loc2: "남구", x: 89, y: 90 }, + "2723000000": { loc1: "대구광역시", loc2: "북구", x: 89, y: 91 }, + "2726000000": { loc1: "대구광역시", loc2: "수성구", x: 89, y: 90 }, + "2729000000": { loc1: "대구광역시", loc2: "달서구", x: 88, y: 90 }, + "2771000000": { loc1: "대구광역시", loc2: "달성군", x: 86, y: 88 }, + "2811000000": { loc1: "인천광역시", loc2: "중구", x: 54, y: 125 }, + "2814000000": { loc1: "인천광역시", loc2: "동구", x: 54, y: 125 }, + "2817700000": { loc1: "인천광역시", loc2: "미추홀구", x: 54, y: 124 }, + "2818500000": { loc1: "인천광역시", loc2: "연수구", x: 55, y: 123 }, + "2820000000": { loc1: "인천광역시", loc2: "남동구", x: 56, y: 124 }, + "2823700000": { loc1: "인천광역시", loc2: "부평구", x: 55, y: 125 }, + "2824500000": { loc1: "인천광역시", loc2: "계양구", x: 56, y: 126 }, + "2826000000": { loc1: "인천광역시", loc2: "서구", x: 55, y: 126 }, + "2871000000": { loc1: "인천광역시", loc2: "강화군", x: 51, y: 130 }, + "2872000000": { loc1: "인천광역시", loc2: "옹진군", x: 54, y: 124 }, + "2911000000": { loc1: "광주광역시", loc2: "동구", x: 60, y: 74 }, + "2914000000": { loc1: "광주광역시", loc2: "서구", x: 59, y: 74 }, + "2915500000": { loc1: "광주광역시", loc2: "남구", x: 59, y: 73 }, + "2917000000": { loc1: "광주광역시", loc2: "북구", x: 59, y: 75 }, + "2920000000": { loc1: "광주광역시", loc2: "광산구", x: 57, y: 74 }, + "3011000000": { loc1: "대전광역시", loc2: "동구", x: 68, y: 100 }, + "3014000000": { loc1: "대전광역시", loc2: "중구", x: 68, y: 100 }, + "3017000000": { loc1: "대전광역시", loc2: "서구", x: 67, y: 100 }, + "3020000000": { loc1: "대전광역시", loc2: "유성구", x: 67, y: 101 }, + "3023000000": { loc1: "대전광역시", loc2: "대덕구", x: 68, y: 100 }, + "3111000000": { loc1: "울산광역시", loc2: "중구", x: 102, y: 84 }, + "3114000000": { loc1: "울산광역시", loc2: "남구", x: 102, y: 84 }, + "3117000000": { loc1: "울산광역시", loc2: "동구", x: 104, y: 83 }, + "3120000000": { loc1: "울산광역시", loc2: "북구", x: 103, y: 85 }, + "3171000000": { loc1: "울산광역시", loc2: "울주군", x: 101, y: 84 }, + "3611000000": { + loc1: "세종특별자치시", + loc2: "세종특별자치시", + x: 66, + y: 103, + }, + "4111100000": { loc1: "경기도", loc2: "수원시장안구", x: 60, y: 121 }, + "4111300000": { loc1: "경기도", loc2: "수원시권선구", x: 60, y: 120 }, + "4111500000": { loc1: "경기도", loc2: "수원시팔달구", x: 61, y: 121 }, + "4111700000": { loc1: "경기도", loc2: "수원시영통구", x: 61, y: 120 }, + "4113100000": { loc1: "경기도", loc2: "성남시수정구", x: 63, y: 124 }, + "4113300000": { loc1: "경기도", loc2: "성남시중원구", x: 63, y: 124 }, + "4113500000": { loc1: "경기도", loc2: "성남시분당구", x: 62, y: 123 }, + "4115000000": { loc1: "경기도", loc2: "의정부시", x: 61, y: 130 }, + "4117100000": { loc1: "경기도", loc2: "안양시만안구", x: 59, y: 123 }, + "4117300000": { loc1: "경기도", loc2: "안양시동안구", x: 59, y: 123 }, + "4119000000": { loc1: "경기도", loc2: "부천시", x: 56, y: 125 }, + "4121000000": { loc1: "경기도", loc2: "광명시", x: 58, y: 125 }, + "4122000000": { loc1: "경기도", loc2: "평택시", x: 62, y: 114 }, + "4125000000": { loc1: "경기도", loc2: "동두천시", x: 61, y: 134 }, + "4127100000": { loc1: "경기도", loc2: "안산시상록구", x: 58, y: 121 }, + "4127300000": { loc1: "경기도", loc2: "안산시단원구", x: 57, y: 121 }, + "4128100000": { loc1: "경기도", loc2: "고양시덕양구", x: 57, y: 128 }, + "4128500000": { loc1: "경기도", loc2: "고양시일산동구", x: 56, y: 129 }, + "4128700000": { loc1: "경기도", loc2: "고양시일산서구", x: 56, y: 129 }, + "4129000000": { loc1: "경기도", loc2: "과천시", x: 60, y: 124 }, + "4131000000": { loc1: "경기도", loc2: "구리시", x: 62, y: 127 }, + "4136000000": { loc1: "경기도", loc2: "남양주시", x: 64, y: 128 }, + "4137000000": { loc1: "경기도", loc2: "오산시", x: 62, y: 118 }, + "4139000000": { loc1: "경기도", loc2: "시흥시", x: 57, y: 123 }, + "4141000000": { loc1: "경기도", loc2: "군포시", x: 59, y: 122 }, + "4143000000": { loc1: "경기도", loc2: "의왕시", x: 60, y: 122 }, + "4145000000": { loc1: "경기도", loc2: "하남시", x: 64, y: 126 }, + "4146100000": { loc1: "경기도", loc2: "용인시처인구", x: 64, y: 119 }, + "4146300000": { loc1: "경기도", loc2: "용인시기흥구", x: 62, y: 120 }, + "4146500000": { loc1: "경기도", loc2: "용인시수지구", x: 62, y: 121 }, + "4148000000": { loc1: "경기도", loc2: "파주시", x: 56, y: 131 }, + "4150000000": { loc1: "경기도", loc2: "이천시", x: 68, y: 121 }, + "4155000000": { loc1: "경기도", loc2: "안성시", x: 65, y: 115 }, + "4157000000": { loc1: "경기도", loc2: "김포시", x: 55, y: 128 }, + "4159000000": { loc1: "경기도", loc2: "화성시", x: 57, y: 119 }, + "4161000000": { loc1: "경기도", loc2: "광주시", x: 65, y: 123 }, + "4163000000": { loc1: "경기도", loc2: "양주시", x: 61, y: 131 }, + "4165000000": { loc1: "경기도", loc2: "포천시", x: 64, y: 134 }, + "4167000000": { loc1: "경기도", loc2: "여주시", x: 71, y: 121 }, + "4180000000": { loc1: "경기도", loc2: "연천군", x: 61, y: 138 }, + "4182000000": { loc1: "경기도", loc2: "가평군", x: 69, y: 133 }, + "4183000000": { loc1: "경기도", loc2: "양평군", x: 69, y: 125 }, + "4311100000": { loc1: "충청북도", loc2: "청주시상당구", x: 69, y: 106 }, + "4311200000": { loc1: "충청북도", loc2: "청주시서원구", x: 69, y: 107 }, + "4311300000": { loc1: "충청북도", loc2: "청주시흥덕구", x: 67, y: 106 }, + "4311400000": { loc1: "충청북도", loc2: "청주시청원구", x: 69, y: 107 }, + "4313000000": { loc1: "충청북도", loc2: "충주시", x: 76, y: 114 }, + "4315000000": { loc1: "충청북도", loc2: "제천시", x: 81, y: 118 }, + "4372000000": { loc1: "충청북도", loc2: "보은군", x: 73, y: 103 }, + "4373000000": { loc1: "충청북도", loc2: "옥천군", x: 71, y: 99 }, + "4374000000": { loc1: "충청북도", loc2: "영동군", x: 74, y: 97 }, + "4374500000": { loc1: "충청북도", loc2: "증평군", x: 71, y: 110 }, + "4375000000": { loc1: "충청북도", loc2: "진천군", x: 68, y: 111 }, + "4376000000": { loc1: "충청북도", loc2: "괴산군", x: 74, y: 111 }, + "4377000000": { loc1: "충청북도", loc2: "음성군", x: 72, y: 113 }, + "4380000000": { loc1: "충청북도", loc2: "단양군", x: 84, y: 115 }, + "4413100000": { loc1: "충청남도", loc2: "천안시동남구", x: 63, y: 110 }, + "4413300000": { loc1: "충청남도", loc2: "천안시서북구", x: 63, y: 112 }, + "4415000000": { loc1: "충청남도", loc2: "공주시", x: 63, y: 102 }, + "4418000000": { loc1: "충청남도", loc2: "보령시", x: 54, y: 100 }, + "4420000000": { loc1: "충청남도", loc2: "아산시", x: 60, y: 110 }, + "4421000000": { loc1: "충청남도", loc2: "서산시", x: 51, y: 110 }, + "4423000000": { loc1: "충청남도", loc2: "논산시", x: 62, y: 97 }, + "4425000000": { loc1: "충청남도", loc2: "계룡시", x: 65, y: 99 }, + "4427000000": { loc1: "충청남도", loc2: "당진시", x: 54, y: 112 }, + "4471000000": { loc1: "충청남도", loc2: "금산군", x: 69, y: 95 }, + "4476000000": { loc1: "충청남도", loc2: "부여군", x: 59, y: 99 }, + "4477000000": { loc1: "충청남도", loc2: "서천군", x: 55, y: 94 }, + "4479000000": { loc1: "충청남도", loc2: "청양군", x: 57, y: 103 }, + "4480000000": { loc1: "충청남도", loc2: "홍성군", x: 55, y: 106 }, + "4481000000": { loc1: "충청남도", loc2: "예산군", x: 58, y: 107 }, + "4482500000": { loc1: "충청남도", loc2: "태안군", x: 48, y: 109 }, + "4511100000": { loc1: "전라북도", loc2: "전주시완산구", x: 63, y: 89 }, + "4511300000": { loc1: "전라북도", loc2: "전주시덕진구", x: 63, y: 89 }, + "4513000000": { loc1: "전라북도", loc2: "군산시", x: 56, y: 92 }, + "4514000000": { loc1: "전라북도", loc2: "익산시", x: 60, y: 91 }, + "4518000000": { loc1: "전라북도", loc2: "정읍시", x: 58, y: 83 }, + "4519000000": { loc1: "전라북도", loc2: "남원시", x: 68, y: 80 }, + "4521000000": { loc1: "전라북도", loc2: "김제시", x: 59, y: 88 }, + "4571000000": { loc1: "전라북도", loc2: "완주군", x: 63, y: 89 }, + "4572000000": { loc1: "전라북도", loc2: "진안군", x: 68, y: 88 }, + "4573000000": { loc1: "전라북도", loc2: "무주군", x: 72, y: 93 }, + "4574000000": { loc1: "전라북도", loc2: "장수군", x: 70, y: 85 }, + "4575000000": { loc1: "전라북도", loc2: "임실군", x: 66, y: 84 }, + "4577000000": { loc1: "전라북도", loc2: "순창군", x: 63, y: 79 }, + "4579000000": { loc1: "전라북도", loc2: "고창군", x: 56, y: 80 }, + "4580000000": { loc1: "전라북도", loc2: "부안군", x: 56, y: 87 }, + "4611000000": { loc1: "전라남도", loc2: "목포시", x: 50, y: 67 }, + "4613000000": { loc1: "전라남도", loc2: "여수시", x: 73, y: 66 }, + "4615000000": { loc1: "전라남도", loc2: "순천시", x: 70, y: 70 }, + "4617000000": { loc1: "전라남도", loc2: "나주시", x: 56, y: 71 }, + "4623000000": { loc1: "전라남도", loc2: "광양시", x: 73, y: 70 }, + "4671000000": { loc1: "전라남도", loc2: "담양군", x: 61, y: 78 }, + "4672000000": { loc1: "전라남도", loc2: "곡성군", x: 66, y: 77 }, + "4673000000": { loc1: "전라남도", loc2: "구례군", x: 69, y: 75 }, + "4677000000": { loc1: "전라남도", loc2: "고흥군", x: 66, y: 62 }, + "4678000000": { loc1: "전라남도", loc2: "보성군", x: 62, y: 66 }, + "4679000000": { loc1: "전라남도", loc2: "화순군", x: 61, y: 72 }, + "4680000000": { loc1: "전라남도", loc2: "장흥군", x: 59, y: 64 }, + "4681000000": { loc1: "전라남도", loc2: "강진군", x: 57, y: 63 }, + "4682000000": { loc1: "전라남도", loc2: "해남군", x: 54, y: 61 }, + "4683000000": { loc1: "전라남도", loc2: "영암군", x: 56, y: 66 }, + "4684000000": { loc1: "전라남도", loc2: "무안군", x: 52, y: 71 }, + "4686000000": { loc1: "전라남도", loc2: "함평군", x: 52, y: 72 }, + "4687000000": { loc1: "전라남도", loc2: "영광군", x: 52, y: 77 }, + "4688000000": { loc1: "전라남도", loc2: "장성군", x: 57, y: 77 }, + "4689000000": { loc1: "전라남도", loc2: "완도군", x: 57, y: 56 }, + "4690000000": { loc1: "전라남도", loc2: "진도군", x: 48, y: 59 }, + "4691000000": { loc1: "전라남도", loc2: "신안군", x: 50, y: 66 }, + "4711100000": { loc1: "경상북도", loc2: "포항시남구", x: 102, y: 94 }, + "4711300000": { loc1: "경상북도", loc2: "포항시북구", x: 102, y: 95 }, + "4713000000": { loc1: "경상북도", loc2: "경주시", x: 100, y: 91 }, + "4715000000": { loc1: "경상북도", loc2: "김천시", x: 80, y: 96 }, + "4717000000": { loc1: "경상북도", loc2: "안동시", x: 91, y: 106 }, + "4719000000": { loc1: "경상북도", loc2: "구미시", x: 84, y: 96 }, + "4721000000": { loc1: "경상북도", loc2: "영주시", x: 89, y: 111 }, + "4723000000": { loc1: "경상북도", loc2: "영천시", x: 95, y: 93 }, + "4725000000": { loc1: "경상북도", loc2: "상주시", x: 81, y: 102 }, + "4728000000": { loc1: "경상북도", loc2: "문경시", x: 81, y: 106 }, + "4729000000": { loc1: "경상북도", loc2: "경산시", x: 91, y: 90 }, + "4772000000": { loc1: "경상북도", loc2: "군위군", x: 88, y: 99 }, + "4773000000": { loc1: "경상북도", loc2: "의성군", x: 90, y: 101 }, + "4775000000": { loc1: "경상북도", loc2: "청송군", x: 96, y: 103 }, + "4776000000": { loc1: "경상북도", loc2: "영양군", x: 97, y: 108 }, + "4777000000": { loc1: "경상북도", loc2: "영덕군", x: 102, y: 103 }, + "4782000000": { loc1: "경상북도", loc2: "청도군", x: 91, y: 86 }, + "4783000000": { loc1: "경상북도", loc2: "고령군", x: 83, y: 87 }, + "4784000000": { loc1: "경상북도", loc2: "성주군", x: 83, y: 91 }, + "4785000000": { loc1: "경상북도", loc2: "칠곡군", x: 85, y: 93 }, + "4790000000": { loc1: "경상북도", loc2: "예천군", x: 86, y: 107 }, + "4792000000": { loc1: "경상북도", loc2: "봉화군", x: 90, y: 113 }, + "4793000000": { loc1: "경상북도", loc2: "울진군", x: 102, y: 115 }, + "4794000000": { loc1: "경상북도", loc2: "울릉군", x: 127, y: 127 }, + "4812100000": { loc1: "경상남도", loc2: "창원시의창구", x: 90, y: 77 }, + "4812300000": { loc1: "경상남도", loc2: "창원시성산구", x: 91, y: 76 }, + "4812500000": { loc1: "경상남도", loc2: "창원시마산합포구", x: 89, y: 76 }, + "4812700000": { loc1: "경상남도", loc2: "창원시마산회원구", x: 89, y: 76 }, + "4812900000": { loc1: "경상남도", loc2: "창원시진해구", x: 91, y: 75 }, + "4817000000": { loc1: "경상남도", loc2: "진주시", x: 81, y: 75 }, + "4822000000": { loc1: "경상남도", loc2: "통영시", x: 87, y: 68 }, + "4824000000": { loc1: "경상남도", loc2: "사천시", x: 80, y: 71 }, + "4825000000": { loc1: "경상남도", loc2: "김해시", x: 95, y: 77 }, + "4827000000": { loc1: "경상남도", loc2: "밀양시", x: 92, y: 83 }, + "4831000000": { loc1: "경상남도", loc2: "거제시", x: 90, y: 69 }, + "4833000000": { loc1: "경상남도", loc2: "양산시", x: 97, y: 79 }, + "4872000000": { loc1: "경상남도", loc2: "의령군", x: 83, y: 78 }, + "4873000000": { loc1: "경상남도", loc2: "함안군", x: 86, y: 77 }, + "4874000000": { loc1: "경상남도", loc2: "창녕군", x: 87, y: 83 }, + "4882000000": { loc1: "경상남도", loc2: "고성군", x: 85, y: 71 }, + "4884000000": { loc1: "경상남도", loc2: "남해군", x: 77, y: 68 }, + "4885000000": { loc1: "경상남도", loc2: "하동군", x: 74, y: 73 }, + "4886000000": { loc1: "경상남도", loc2: "산청군", x: 76, y: 80 }, + "4887000000": { loc1: "경상남도", loc2: "함양군", x: 74, y: 82 }, + "4888000000": { loc1: "경상남도", loc2: "거창군", x: 77, y: 86 }, + "4889000000": { loc1: "경상남도", loc2: "합천군", x: 81, y: 84 }, + "5011000000": { loc1: "제주특별자치도", loc2: "제주시", x: 53, y: 38 }, + "5013000000": { loc1: "제주특별자치도", loc2: "서귀포시", x: 52, y: 33 }, + "5111000000": { loc1: "강원특별자치도", loc2: "춘천시", x: 73, y: 134 }, + "5113000000": { loc1: "강원특별자치도", loc2: "원주시", x: 76, y: 122 }, + "5115000000": { loc1: "강원특별자치도", loc2: "강릉시", x: 92, y: 131 }, + "5117000000": { loc1: "강원특별자치도", loc2: "동해시", x: 97, y: 127 }, + "5119000000": { loc1: "강원특별자치도", loc2: "태백시", x: 95, y: 119 }, + "5121000000": { loc1: "강원특별자치도", loc2: "속초시", x: 87, y: 141 }, + "5123000000": { loc1: "강원특별자치도", loc2: "삼척시", x: 98, y: 125 }, + "5172000000": { loc1: "강원특별자치도", loc2: "홍천군", x: 75, y: 130 }, + "5173000000": { loc1: "강원특별자치도", loc2: "횡성군", x: 77, y: 125 }, + "5175000000": { loc1: "강원특별자치도", loc2: "영월군", x: 86, y: 119 }, + "5176000000": { loc1: "강원특별자치도", loc2: "평창군", x: 84, y: 123 }, + "5177000000": { loc1: "강원특별자치도", loc2: "정선군", x: 89, y: 123 }, + "5178000000": { loc1: "강원특별자치도", loc2: "철원군", x: 65, y: 139 }, + "5179000000": { loc1: "강원특별자치도", loc2: "화천군", x: 72, y: 139 }, + "5180000000": { loc1: "강원특별자치도", loc2: "양구군", x: 77, y: 139 }, + "5181000000": { loc1: "강원특별자치도", loc2: "인제군", x: 80, y: 138 }, + "5182000000": { loc1: "강원특별자치도", loc2: "고성군", x: 85, y: 145 }, + "5183000000": { loc1: "강원특별자치도", loc2: "양양군", x: 88, y: 138 }, +}; diff --git a/src/create/WeatherBox/helper.ts b/src/create/WeatherBox/helper.ts new file mode 100644 index 00000000..1388e600 --- /dev/null +++ b/src/create/WeatherBox/helper.ts @@ -0,0 +1,72 @@ +import { BASE_TIMES, LOCATION_OBJECT } from "./const"; + +/** + * @description loc1 배열을 반환 + */ +export const getLoc1Arrays = () => { + return Object.values(LOCATION_OBJECT).reduce((prev, curr) => { + if (!prev.includes(curr.loc1)) return [...prev, curr.loc1]; + return prev; + }, []); +}; + +/** + * @description loc1에 해당하는 loc2 배열을 반환 + */ +export const getLoc2Arrays = (loc1: string) => { + return Object.values(LOCATION_OBJECT).reduce((prev, curr) => { + if (curr.loc1 === loc1 && !prev.includes(curr.loc2)) + return [...prev, curr.loc2]; + return prev; + }, []); +}; + +/** + * @description loc1, loc2에 해당하는 locationCode를 반환 + */ +export const getLocationCode = (loc1: string, loc2: string) => { + if (loc1 === "" || loc2 === "") return ""; + const selectedLoc = Object.entries(LOCATION_OBJECT).find( + ([_, value]) => value.loc1 === loc1 && value.loc2 === loc2, + ); + return selectedLoc?.[0] ?? ""; +}; + +/** + * @description Date 데이터를 YYYYMMDD 형식으로 반환 + */ +export const formatDate = (dateString?: string | number) => { + const date = new Date(dateString ?? Date.now()); + const year = date.getFullYear(); + const month = (date.getMonth() + 1).toString().padStart(2, "0"); + const day = date.getDate().toString().padStart(2, "0"); + return `${year}${month}${day}`; +}; + +/** + * @description 현재 시간에 맞는 base_date, base_time을 반환 + */ +export const getCorrectBaseTime = () => { + const today = new Date(); + const currentHour = today.getHours(); + const currentMinute = today.getMinutes(); + + if (currentHour < 2 || (currentHour === 2 && currentMinute < 10)) + return { + base_date: formatDate(today.setDate(today.getDate() - 1)), + base_time: "2300", + }; + + for (let i = 1; i < BASE_TIMES.length; i++) { + const baseTime = BASE_TIMES[i - 1]; + if ( + currentHour < i * 3 + 2 || + (currentHour === i * 3 + 2 && currentMinute < 10) + ) { + return { + base_date: formatDate(), + base_time: baseTime, + }; + } + } +}; diff --git a/src/create/WeatherBox/index.tsx b/src/create/WeatherBox/index.tsx new file mode 100644 index 00000000..9af86676 --- /dev/null +++ b/src/create/WeatherBox/index.tsx @@ -0,0 +1,68 @@ +import axios from "axios"; +import Image from "next/image"; +import { useEffect, useState } from "react"; +import { LOCATION_OBJECT } from "./const"; +import { WeatherBoxProps, WeatherObject, WeatherResponse } from "./interfaces"; +import Sunny from "/public/assets/weather/sunny.png"; + +const WeatherBox = (props: WeatherBoxProps) => { + const locObj = LOCATION_OBJECT[props.locationCode]; + const [weatherObject, setWeatherObject] = useState(); + + useEffect(() => { + axios + .get("/api/weather", { params: props }) + .then((res) => { + const rawDate = props.date.replace(/-/g, ""); + if (res.data[rawDate]) { + console.log(res.data[rawDate]); + setWeatherObject(res.data[rawDate]); + } + return; + }) + .catch((err) => {}); + }, [props.locationCode]); + + const getWeatherText = () => { + return ""; + }; + + return ( +
+
+
+
+ {locObj?.loc1} +
+
+ {locObj?.loc2} +
+
+ {getWeatherText()} + {/* TODO: 하늘상태, 강수상태에 따른 텍스트 변경 기능 추가 */} +
+
+
+ {weatherObject?.TMX && weatherObject?.TMN ? ( + <> +
+ + {weatherObject?.TMN} / {weatherObject?.TMX} + + °C +
+
+ + {/* TODO: 하늘상태, 강수상태에 따른 아이콘 변경 기능 추가 */} +
+ + ) : ( +
예상 날씨를 알 수 없어요
+ )} +
+
+
+ ); +}; + +export default WeatherBox; diff --git a/src/create/WeatherBox/interfaces.ts b/src/create/WeatherBox/interfaces.ts new file mode 100644 index 00000000..9b60d029 --- /dev/null +++ b/src/create/WeatherBox/interfaces.ts @@ -0,0 +1,46 @@ +export interface WeatherBoxProps { + date: string; + locationCode: string; +} +export interface WeatherItem { + baseDate: string; + baseTime: string; + category: WCategory; + fcstDate: string; + fcstTime: string; + fcstValue: string; + nx: number; + ny: number; +} +export interface LocationProps { + loc1: string; + loc2: string; + x: number; + y: number; +} +export type WCategory = + | "POP" + | "PTY" + | "PCP" + | "REH" + | "SNO" + | "SKY" + | "TMP" + | "TMN" + | "TMX" + | "UUU" + | "VVV" + | "WAV" + | "VEC" + | "WSD"; + +export interface WeatherObject { + TMP: number[]; + SKY: number[]; + PTY: number[]; + TMN?: number; + TMX?: number; +} +export interface WeatherResponse { + [key: string]: WeatherObject; +} From c64f987dc81a3b486163d7d5de8ee5fa082c5ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=95=ED=98=84?= Date: Sun, 12 Nov 2023 03:08:16 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Feat:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9A=A9=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/test/weather-test.tsx | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pages/test/weather-test.tsx diff --git a/pages/test/weather-test.tsx b/pages/test/weather-test.tsx new file mode 100644 index 00000000..f75c5dc3 --- /dev/null +++ b/pages/test/weather-test.tsx @@ -0,0 +1,57 @@ +import WeatherBox from "create/WeatherBox"; +import { + getLoc1Arrays, + getLoc2Arrays, + getLocationCode, +} from "create/WeatherBox/helper"; +import { ChangeEvent, useEffect, useState } from "react"; +import SelectBox from "@shared/components/SelectBox"; + +const WeatherTest = () => { + const [loc1Arrays] = useState(getLoc1Arrays()); + const [loc2Arrays, setLoc2Arrays] = useState([]); + + const [selectedLoc1, setSelectedLoc1] = useState(""); + const [selectedLoc2, setSelectedLoc2] = useState(""); + + const [date, setDate] = useState(""); + + useEffect(() => { + setLoc2Arrays(getLoc2Arrays(selectedLoc1)); + setSelectedLoc2(""); + }, [selectedLoc1]); + + const handleChangeSelectBoxLoc1 = (e: ChangeEvent) => { + setSelectedLoc1(e.target.value); + }; + + const handleChangeSelectBoxLoc2 = (e: ChangeEvent) => { + setSelectedLoc2(e.target.value); + }; + + const handleChangeDate = (e: ChangeEvent) => { + setDate(e.target.value); + }; + + return ( +
+ + + + +
+ ); +}; + +export default WeatherTest; From 455b6b349b0be76585924446685e031091ea7ea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B0=95=ED=98=84?= Date: Sun, 12 Nov 2023 03:08:41 +0900 Subject: [PATCH 5/5] =?UTF-8?q?style:=20color=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=B2=B4=EB=A6=AC=ED=94=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tailwind.config.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tailwind.config.js b/tailwind.config.js index 738d1256..3aff6dce 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -6,6 +6,19 @@ module.exports = { ], theme: { extend: { + colors: { + "c-accept": "#00D179", // green. 확인용 색상 + "c-accept-disabled": "#00D17975", // green-disabled + "c-warn": "#FACD49", // yellow. 경고용 색상 + "c-warn-disabled": "#FACD4975", // yellow-disabled + "c-danger": "#FF2330", // red. 에러용 색상 + "c-danger-disabled": "#FFA4A475", // red-disabled + "c-pink": "#F864A1", + "c-orange": "#F5A200", + "c-purple": "#A564F8", + "c-gray": "#BABABA", + "c-black": "#222222", + }, backgroundImage: { stayLoggedIn: "url(/images/samples/StayLoggedIn.svg)", idLabel: "url(/images/samples/IdLabel.svg)",