U)a*OD(eYgSi^cdTn}pqcPM(;S)2%1By^Wh%-CaC%>d9hi`7J zaxL7@;nhA>PE%s99&;z{8>VFgf{u!(-B-x7Of6ueme+ScryL`h(^qKE)DtieWY>-7 zgB)VJESQS4*1LU(2&@pgLvSt{(((C?K_V(rQk``i&5}ZPG;G^FiPlZ$7|-vEmMWlU z5lQ%iK2nu=h2wd_7>gK@vX=*AG+u~rQP$NwPC`ZA?4nh{3tui1x@bT6-;Rk3yDQ>d z?3qRD#+PeV7#FAa>s`Xwxsx_oRFcN$StW2=CW`=qObsT?SD^#^jM1Yk}PSPxJ zG@-_mnNU_)vM|iLRSI>UMp|hatyS}17R{10IuL0TLlupt>9dR s_SPQbv7BLYyC#qv16E-y@XZ= z-!p7I%#r-BVi$nQq3&ssRc_IC%R6$tA&^s_l46880~Wst3@>(|EO<}T4~ci~#!=e; zD)B>o%1+$ksURD1p7I-<3ehlFyVkqrySf&gg>Bp
0Z9?JaG|gyTZ{Cb8SdvAWVmFX7v2ohs!OCc!Udk zUITUpmZ33rKLI#(&lDj}c KA#dpL4Fil=$5pu_wi1XJR !llw` zSItPBDEdMHk2>c7#%lBxZ HHvtVUOZ$}v?=?AT~9!Jcqa@IJGuMg(s^7r>pcTrd)pS`{5Cu8WPey` z9)!!OUUY@L%9Q+bZa*S5`3f_|lFCPN6kdp_M2>{le8;cn^XUsPa+TUk47qd6)IBR% zk*&Ip?!Ge_gmmdj)BX}P_5o@VI2*wbZ^>UhFju}0gQZh!pP%4XT9{@w;G#b3XK8sN zF(7i$Jv(IM$8Akys9dhP^^~H2(7BfJp}yDW1#@!CL-!mGcSCnJ599WK9MV@yo_u$v MDeX2GIKR{Qf5okjU;qFB literal 0 HcmV?d00001 diff --git a/app/public/index.html b/app/public/index.html new file mode 100644 index 0000000000..aa069f27cb --- /dev/null +++ b/app/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + + + + + diff --git a/app/public/logo192.png b/app/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h +t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D ~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p4 1doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8 uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B %6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4 M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3R BsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^| rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1i StW;*^={rP 1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcM Xv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~ FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD0c>*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7Vk HxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5F gPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n }g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOF XB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e- voloX`4DQyEK+DmrZh8A$) iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A {EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS( JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{ (rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js! g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX `sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn< ?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs ?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00H AB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOc Lqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf} bD7nW^Haf}_gXciYKX{QBxIPSx2 Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+M HeZ*OE4v *otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W- ;SmFkR 8HEZ JWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2 QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(| 6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw2 3dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv &K?HS4QLoylJ|OAF z`8atBNTzJ&AQ !>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO &*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpN AR?q@1U59 zO+)QW wL8t zyip?u_nI+K$uh{ y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP |(1g7i_Q<>aEAT{5( yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ 7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSD CIrjk+M1R!X7s 4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt93 9UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>| >RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(f u}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CG JQtmgNAj^h9B#zma MDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z !xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X 0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS} 0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7 ;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f ~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cF ha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZ G`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4a IiybZHHagF{ ;IcD(dPO!#=u zWfqLcPc^+7Uu#l(B pxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^ U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2q b6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy( ;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*- zxcvU4viy &Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4 !Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDq s1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f! 7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq ?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#i ZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra 83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY| %*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkw zVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3s mwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/app/public/manifest.json b/app/public/manifest.json new file mode 100644 index 0000000000..080d6c77ac --- /dev/null +++ b/app/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/app/public/robots.txt b/app/public/robots.txt new file mode 100644 index 0000000000..e9e57dc4d4 --- /dev/null +++ b/app/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/app/src/App.css b/app/src/App.css new file mode 100644 index 0000000000..493161332b --- /dev/null +++ b/app/src/App.css @@ -0,0 +1,3 @@ +.App { + text-align: center; +} diff --git a/app/src/App.js b/app/src/App.js new file mode 100644 index 0000000000..646843e499 --- /dev/null +++ b/app/src/App.js @@ -0,0 +1,12 @@ +import React from 'react'; +import './App.css'; + +function App() { + return ( + ++ ); +} + +export default App; diff --git a/app/src/App.test.js b/app/src/App.test.js new file mode 100644 index 0000000000..4db7ebc25c --- /dev/null +++ b/app/src/App.test.js @@ -0,0 +1,9 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + const { getByText } = render(hello world
+); + const linkElement = getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/app/src/index.js b/app/src/index.js new file mode 100644 index 0000000000..abefd0a697 --- /dev/null +++ b/app/src/index.js @@ -0,0 +1,11 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +ReactDOM.render( + + , + document.getElementById('root') +); + diff --git a/app/src/setupTests.js b/app/src/setupTests.js new file mode 100644 index 0000000000..74b1a275a0 --- /dev/null +++ b/app/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom/extend-expect'; From 4d92ab4675bf44c3c9630f1e30923c8f1f05b5ca Mon Sep 17 00:00:00 2001 From: Sam Lalli <2sam.lalli@gmail.com> Date: Wed, 7 Oct 2020 22:51:27 -0600 Subject: [PATCH 2/7] finished project --- app/package-lock.json | 99 +++++++++++++++++++++++++++++-- app/package.json | 6 +- app/src/App.css | 84 ++++++++++++++++++++++++++ app/src/App.js | 23 +++++-- app/src/actions/index.js | 24 ++++++++ app/src/components/CountryCard.js | 22 +++++++ app/src/components/CountryList.js | 23 +++++++ app/src/components/Header.js | 27 +++++++++ app/src/index.js | 16 +++-- app/src/reducers/index.js | 27 +++++++++ 10 files changed, 335 insertions(+), 16 deletions(-) create mode 100644 app/src/actions/index.js create mode 100644 app/src/components/CountryCard.js create mode 100644 app/src/components/CountryList.js create mode 100644 app/src/components/Header.js create mode 100644 app/src/reducers/index.js diff --git a/app/package-lock.json b/app/package-lock.json index feb4727bdc..6972e8f459 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1161,6 +1161,29 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -2515,6 +2538,14 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" }, + "axios": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -2712,6 +2743,22 @@ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" }, + "babel-plugin-styled-components": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.11.1.tgz", + "integrity": "sha512-YwrInHyKUk1PU3avIRdiLyCpM++18Rs1NgyMXEAQC33rIXs/vro0A+stf4sT0Gf22Got+xRWB8Cm0tw+qkRzBA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-module-imports": "^7.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", @@ -3372,6 +3419,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -3999,6 +4051,11 @@ "postcss": "^7.0.5" } }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" + }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -4089,6 +4146,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -10775,11 +10842,6 @@ "workbox-webpack-plugin": "4.3.1" } }, - "react-thunk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-thunk/-/react-thunk-1.0.0.tgz", - "integrity": "sha1-eYE9R/MRR+ga7oQe1edqnj6ryLE=" - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -10851,6 +10913,11 @@ "symbol-observable": "^1.2.0" } }, + "redux-thunk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + }, "regenerate": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", @@ -11587,6 +11654,11 @@ } } }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -12316,6 +12388,23 @@ } } }, + "styled-components": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.2.0.tgz", + "integrity": "sha512-9qE8Vgp8C5cpGAIdFaQVAl89Zgx1TDM4Yf4tlHbO9cPijtpSXTMLHy9lmP0lb+yImhgPFb1AmZ1qMUubmg3HLg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + } + }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", diff --git a/app/package.json b/app/package.json index 91fdb548ba..b1beb945b6 100644 --- a/app/package.json +++ b/app/package.json @@ -6,12 +6,14 @@ "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.2.1", + "axios": "^0.20.0", "react": "^16.13.1", "react-dom": "^16.13.1", "react-redux": "^7.2.1", "react-scripts": "3.4.3", - "react-thunk": "^1.0.0", - "redux": "^4.0.5" + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", + "styled-components": "^5.2.0" }, "scripts": { "start": "react-scripts start", diff --git a/app/src/App.css b/app/src/App.css index 493161332b..8973e9891b 100644 --- a/app/src/App.css +++ b/app/src/App.css @@ -1,3 +1,87 @@ +html { + height: 100%; + font-family: Arial, Helvetica, sans-serif; + background-color: lightslategray; + padding: none; + margin: none; +} .App { text-align: center; } + +/* header styles */ +.Header{ + background-image: url(https://images.unsplash.com/photo-1473163928189-364b2c4e1135?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1950&q=80); + height: 50vh; + background-size: cover; + background-position: center; + opacity: 70%; + margin: 0, auto; + border: 5px solid oldlace; + display: flex; + justify-content: center; + align-items: center; +} + +.header-text{ + color:black; + opacity: 100%; + width: 40%; +} + +select{ + background-color: lightslategray; + color:black; + border: 2px solid black; +} + +option{ + color: black; +} + + +/* header styles end */ + + +/* card styles */ +.CountryList { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + margin-top: 5%; + margin-left: 2%; + margin-right: 2%; +} + +.card{ + display: flex; + flex-direction: column; + border: 10px solid black; + border-radius: 25%; + background-color: oldlace; + width:20%; + margin-bottom: 2%; + transition: ease-in-out .5s; +} +.card:hover{ + background-color: darkolivegreen; + transition: ease-in-out .5s; + color: white; +} + + +.info img{ + margin-top: 4%; + height: 10vh; +} + +.info h2{ + text-decoration: underline; +} + +.info p{ + font-weight: bold; +} + + +/* card styles end */ \ No newline at end of file diff --git a/app/src/App.js b/app/src/App.js index 646843e499..9c36be28f0 100644 --- a/app/src/App.js +++ b/app/src/App.js @@ -1,12 +1,25 @@ -import React from 'react'; -import './App.css'; +import React, { useEffect } from 'react'; +import { fetchCountry } from './actions' +import { connect } from "react-redux" +import Header from "./components/Header" +import CountryList from './components/CountryList'; +import './app.css'; + + +function App(props) { + const { fetchCountry } = props + + useEffect(() =>{ + fetchCountry() + }) -function App() { return (+ -); } -export default App; +export default connect(null, { fetchCountry })(App); + diff --git a/app/src/actions/index.js b/app/src/actions/index.js new file mode 100644 index 0000000000..8d1478c271 --- /dev/null +++ b/app/src/actions/index.js @@ -0,0 +1,24 @@ +import axios from 'axios' +//https://restcountries.eu/rest/v2/region/{region} +//https://restcountries.eu/rest/v2/region/americas + +/// action suite (not industry term) +//1. action types +// 2. action creators +// 3. action objects + +export const FETCH_START = 'FETCH_START'; +export const FETCH_SUCCESS = "FETCH_SUCCESS" + +export const fetchCountry = () => (dispatch) =>{ + dispatch({ type: FETCH_START }); + axios + .get('https://restcountries.eu/rest/v2/region/americas') + .then(res => { + console.log(res.data) + dispatch({type: FETCH_SUCCESS, payload: res.data }) + }) + .catch(err => console.log(err, 'fetched failed!')) + + +} diff --git a/app/src/components/CountryCard.js b/app/src/components/CountryCard.js new file mode 100644 index 0000000000..53e93f0da3 --- /dev/null +++ b/app/src/components/CountryCard.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { connect } from "react-redux"; +//import styled from 'styled-components'; +import "../app.css" + +function CountryCard(props) { + const {capital, flag, subregion, population, name} = props.item + return ( +hello world
++ ++ ); +} + +export default connect(null, {})(CountryCard); \ No newline at end of file diff --git a/app/src/components/CountryList.js b/app/src/components/CountryList.js new file mode 100644 index 0000000000..55f9ab6069 --- /dev/null +++ b/app/src/components/CountryList.js @@ -0,0 +1,23 @@ +import React from 'react'; +import { connect } from "react-redux" +import '../app.css'; +import CountryCard from './CountryCard'; + +function CountryList(props) { + + return ( +++ ++
{name}
+Capital: {capital}
+Population: {population}
+Subregion: {subregion}
++ {props.country.map((item)=> ( ++ ); +} + +const mapStateToProps = state => { + return { + country: state.country + }; +}; + +export default connect(mapStateToProps, {})(CountryList); \ No newline at end of file diff --git a/app/src/components/Header.js b/app/src/components/Header.js new file mode 100644 index 0000000000..9056eb9cd4 --- /dev/null +++ b/app/src/components/Header.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { connect } from "react-redux" +import '../app.css'; + +const Header = () => { + return ( ++ ))} + ++ ); +} + +export default connect(null, { })(Header); diff --git a/app/src/index.js b/app/src/index.js index abefd0a697..f3a5fba871 100644 --- a/app/src/index.js +++ b/app/src/index.js @@ -1,11 +1,19 @@ import React from 'react'; import ReactDOM from 'react-dom'; +import { createStore, applyMiddleware } from 'redux' +import { Provider } from 'react-redux' +import thunk from 'redux-thunk' +import { reducer } from "./reducers" import App from './App'; +import "./app.css" + +const store = createStore(reducer, applyMiddleware(thunk)); + +const rootElement = document.getElementById("root"); ReactDOM.render( -++Explore The World One Region At A Time
+Click Below To Select Region
+ ++ , - document.getElementById('root') + , + rootElement ); - diff --git a/app/src/reducers/index.js b/app/src/reducers/index.js new file mode 100644 index 0000000000..913c23094a --- /dev/null +++ b/app/src/reducers/index.js @@ -0,0 +1,27 @@ +import {FETCH_START, FETCH_SUCCESS} from '../actions' + +const initialState = { + country: [], + isLoading: false, + error: '' +} + +export const reducer = (state = initialState, action) => { + switch (action.type) { + case FETCH_START: + return { + ...state, + isLoading: true + }; + case FETCH_SUCCESS: + return { + ...state, + country: action.payload, + isLoading: true + } + + default: + return state; + } + +} \ No newline at end of file From c9797fc3179257b10b52d8379f1a047c95c16555 Mon Sep 17 00:00:00 2001 From: Sam Lalli <2sam.lalli@gmail.com> Date: Sat, 10 Apr 2021 11:56:34 -0600 Subject: [PATCH 3/7] redux practice manipulating api start --- .gitignore | 2 ++ app/src/App.css | 4 ++-- app/src/actions/index.js | 10 +++++++++- app/src/reducers/index.js | 13 ++++++++++--- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 4d29575de8..81b368c540 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +.vercel diff --git a/app/src/App.css b/app/src/App.css index 8973e9891b..126e44e87e 100644 --- a/app/src/App.css +++ b/app/src/App.css @@ -25,12 +25,12 @@ html { .header-text{ color:black; - opacity: 100%; width: 40%; + font-weight: bold; } select{ - background-color: lightslategray; + background-color: oldlace; color:black; border: 2px solid black; } diff --git a/app/src/actions/index.js b/app/src/actions/index.js index 8d1478c271..ce3db1dc9f 100644 --- a/app/src/actions/index.js +++ b/app/src/actions/index.js @@ -9,6 +9,7 @@ import axios from 'axios' export const FETCH_START = 'FETCH_START'; export const FETCH_SUCCESS = "FETCH_SUCCESS" +export const FETCH_FAILURE = "FETCH_FAILURE" export const fetchCountry = () => (dispatch) =>{ dispatch({ type: FETCH_START }); @@ -18,7 +19,14 @@ export const fetchCountry = () => (dispatch) =>{ console.log(res.data) dispatch({type: FETCH_SUCCESS, payload: res.data }) }) - .catch(err => console.log(err, 'fetched failed!')) + .catch(err => { + console.log(err, 'fetched failed!') + dispatch({ type: FETCH_FAILURE, payload: err}) + }) } + +// changeable input to switch api call region +// dropdown menu +// input variable on end of axios call diff --git a/app/src/reducers/index.js b/app/src/reducers/index.js index 913c23094a..b0d11e27df 100644 --- a/app/src/reducers/index.js +++ b/app/src/reducers/index.js @@ -1,4 +1,4 @@ -import {FETCH_START, FETCH_SUCCESS} from '../actions' +import {FETCH_START, FETCH_SUCCESS, FETCH_FAILURE} from '../actions' const initialState = { country: [], @@ -17,11 +17,18 @@ export const reducer = (state = initialState, action) => { return { ...state, country: action.payload, - isLoading: true + isLoading: false + } + case FETCH_FAILURE: + return { + ...state, + error: action.payload, + isLoading: false + } default: return state; } -} \ No newline at end of file +} From 04453ae84c16f774dd3832a73acde7157561267c Mon Sep 17 00:00:00 2001 From: Sam Lalli <2sam.lalli@gmail.com> Date: Mon, 12 Apr 2021 11:21:33 -0600 Subject: [PATCH 4/7] planning notes written --- app/src/actions/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/actions/index.js b/app/src/actions/index.js index ce3db1dc9f..a621e71615 100644 --- a/app/src/actions/index.js +++ b/app/src/actions/index.js @@ -28,5 +28,5 @@ export const fetchCountry = () => (dispatch) =>{ } // changeable input to switch api call region -// dropdown menu -// input variable on end of axios call +// store dropdown input in state, create different dispatch calls +// if statement on useeffect dependency array based on when state changes From 3f9fc3dc833ce6175a9b239961038fe00eb010af Mon Sep 17 00:00:00 2001 From: Sam Lalli <2sam.lalli@gmail.com> Date: Tue, 13 Apr 2021 22:59:57 -0600 Subject: [PATCH 5/7] mostly finished --- app/src/components/Header.js | 13 ++++++++++++- app/src/reducers/index.js | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/components/Header.js b/app/src/components/Header.js index 9056eb9cd4..698cd70d6e 100644 --- a/app/src/components/Header.js +++ b/app/src/components/Header.js @@ -3,6 +3,11 @@ import { connect } from "react-redux" import '../app.css'; const Header = () => { + + onChange = (e, id) => { + + } + return (- @@ -24,4 +29,10 @@ const Header = () => { ); } -export default connect(null, { })(Header); +const mapStateToProps = state => { + return { + region: state.region + }; +}; + +export default connect(mapStateToProps, { })(Header); diff --git a/app/src/reducers/index.js b/app/src/reducers/index.js index b0d11e27df..4a7d0a4053 100644 --- a/app/src/reducers/index.js +++ b/app/src/reducers/index.js @@ -3,7 +3,8 @@ import {FETCH_START, FETCH_SUCCESS, FETCH_FAILURE} from '../actions' const initialState = { country: [], isLoading: false, - error: '' + error: '', + region: '' } export const reducer = (state = initialState, action) => { From ad3912a4c0d25e2cf49391c13c3106dc5f296faa Mon Sep 17 00:00:00 2001 From: Sam Lalli <2sam.lalli@gmail.com> Date: Thu, 15 Apr 2021 16:52:22 -0600 Subject: [PATCH 6/7] state-updated --- app/src/App.js | 14 ++++++++++---- app/src/actions/index.js | 8 ++++++-- app/src/components/Header.js | 28 ++++++++++++---------------- app/src/reducers/index.js | 4 +--- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/app/src/App.js b/app/src/App.js index 9c36be28f0..6dc383d676 100644 --- a/app/src/App.js +++ b/app/src/App.js @@ -7,11 +7,11 @@ import './app.css'; function App(props) { - const { fetchCountry } = props + const { fetchCountry, region } = props useEffect(() =>{ - fetchCountry() - }) + fetchCountry(region) + },[region]) return (@@ -21,5 +21,11 @@ function App(props) { ); } -export default connect(null, { fetchCountry })(App); +const mapStateToProps = state => { + return { + region: state.region + }; +}; + +export default connect(mapStateToProps, { fetchCountry })(App); diff --git a/app/src/actions/index.js b/app/src/actions/index.js index a621e71615..0f12d5f865 100644 --- a/app/src/actions/index.js +++ b/app/src/actions/index.js @@ -10,11 +10,12 @@ import axios from 'axios' export const FETCH_START = 'FETCH_START'; export const FETCH_SUCCESS = "FETCH_SUCCESS" export const FETCH_FAILURE = "FETCH_FAILURE" +export const UPDATE_REGION = "UPDATE_REGION" -export const fetchCountry = () => (dispatch) =>{ +export const fetchCountry = (region) => (dispatch) =>{ dispatch({ type: FETCH_START }); axios - .get('https://restcountries.eu/rest/v2/region/americas') + .get(`https://restcountries.eu/rest/v2/region/${region}`) .then(res => { console.log(res.data) dispatch({type: FETCH_SUCCESS, payload: res.data }) @@ -30,3 +31,6 @@ export const fetchCountry = () => (dispatch) =>{ // changeable input to switch api call region // store dropdown input in state, create different dispatch calls // if statement on useeffect dependency array based on when state changes + +//docs.lambdaschool +//eslintprettier \ No newline at end of file diff --git a/app/src/components/Header.js b/app/src/components/Header.js index 698cd70d6e..0631cdbe23 100644 --- a/app/src/components/Header.js +++ b/app/src/components/Header.js @@ -1,11 +1,13 @@ import React from 'react'; import { connect } from "react-redux" import '../app.css'; +import { updateRegion } from "../actions" -const Header = () => { - - onChange = (e, id) => { +const Header = (props) => { + const {updateRegion} = props + const handleRegionChange = (e) => { + updateRegion(e.target.value) } return ( @@ -15,13 +17,12 @@ const Header = () => {@@ -29,10 +30,5 @@ const Header = () => { ); } -const mapStateToProps = state => { - return { - region: state.region - }; -}; -export default connect(mapStateToProps, { })(Header); +export default connect(null, {updateRegion})(Header); diff --git a/app/src/reducers/index.js b/app/src/reducers/index.js index 4a7d0a4053..4b4ab51225 100644 --- a/app/src/reducers/index.js +++ b/app/src/reducers/index.js @@ -4,7 +4,7 @@ const initialState = { country: [], isLoading: false, error: '', - region: '' + region: 'africa' } export const reducer = (state = initialState, action) => { @@ -25,9 +25,7 @@ export const reducer = (state = initialState, action) => { ...state, error: action.payload, isLoading: false - } - default: return state; } From 8b5224daf073e02821c9b0bc637fe8cec919f650 Mon Sep 17 00:00:00 2001 From: Sam Lalli <2sam.lalli@gmail.com> Date: Wed, 12 May 2021 22:18:17 -0600 Subject: [PATCH 7/7] props passing --- app/src/App.js | 2 +- app/src/components/Header.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/App.js b/app/src/App.js index 6dc383d676..5bd5062c71 100644 --- a/app/src/App.js +++ b/app/src/App.js @@ -15,7 +15,7 @@ function App(props) { return (Click Below To Select Region
-); diff --git a/app/src/components/Header.js b/app/src/components/Header.js index 0631cdbe23..251360e7ca 100644 --- a/app/src/components/Header.js +++ b/app/src/components/Header.js @@ -1,13 +1,13 @@ import React from 'react'; import { connect } from "react-redux" import '../app.css'; -import { updateRegion } from "../actions" +//import { updateRegion } from "../actions" const Header = (props) => { - const {updateRegion} = props + let {region} = props const handleRegionChange = (e) => { - updateRegion(e.target.value) + region = (e.target.value) } return ( @@ -31,4 +31,4 @@ const Header = (props) => { } -export default connect(null, {updateRegion})(Header); +export default connect(null, {})(Header);+