From 93c83e559cd28246f47f31fe0156b4e9afa809a2 Mon Sep 17 00:00:00 2001 From: Jong Min Choi <01jongminchoi@gmail.com> Date: Tue, 15 Mar 2022 15:56:44 -0400 Subject: [PATCH] added ingredient sign and menu date selection --- .../Egg.imageset/Contents.json | 52 ++++++++++++++++++ .../Dining Menu Icons/Egg.imageset/Egg-1.png | Bin 0 -> 1821 bytes .../Dining Menu Icons/Egg.imageset/Egg.png | Bin 0 -> 1358 bytes .../Fish.imageset/Contents.json | 52 ++++++++++++++++++ .../Fish.imageset/Fish-1.png | Bin 0 -> 1103 bytes .../Dining Menu Icons/Fish.imageset/Fish.png | Bin 0 -> 858 bytes .../Milk.imageset/Contents.json | 52 ++++++++++++++++++ .../Milk.imageset/Milk-1.png | Bin 0 -> 987 bytes .../Dining Menu Icons/Milk.imageset/Milk.png | Bin 0 -> 803 bytes .../Soy.imageset/Contents.json | 52 ++++++++++++++++++ .../Dining Menu Icons/Soy.imageset/Soy-1.png | Bin 0 -> 1653 bytes .../Dining Menu Icons/Soy.imageset/Soy.png | Bin 0 -> 1250 bytes .../Tree Nut.imageset/Contents.json | 52 ++++++++++++++++++ .../Tree Nut.imageset/Tree Nut-1.png | Bin 0 -> 2006 bytes .../Tree Nut.imageset/Tree Nut.png | Bin 0 -> 1538 bytes .../Wheat.imageset/Contents.json | 52 ++++++++++++++++++ .../Wheat.imageset/Wheat.png | Bin 0 -> 1202 bytes .../Wheat.imageset/Wheat:Gluten.png | Bin 0 -> 889 bytes .../Dining/Networking + Cache/DiningAPI.swift | 5 +- .../SwiftUI/DiningViewModelSwiftUI.swift | 43 +++++++++------ .../DiningVenueDetailMenuView.swift | 11 +++- .../Detail View/DiningVenueDetailView.swift | 2 +- .../Detail View/MenuDisclosureGroup.swift | 8 ++- 23 files changed, 357 insertions(+), 24 deletions(-) create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Contents.json create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Egg-1.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Egg.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Fish.imageset/Contents.json create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Fish.imageset/Fish-1.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Fish.imageset/Fish.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Milk.imageset/Contents.json create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Milk.imageset/Milk-1.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Milk.imageset/Milk.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Soy.imageset/Contents.json create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Soy.imageset/Soy-1.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Soy.imageset/Soy.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Contents.json create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Tree Nut-1.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Tree Nut.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Contents.json create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Wheat.png create mode 100644 PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Wheat:Gluten.png diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Contents.json b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Contents.json new file mode 100644 index 000000000..af4e3bff0 --- /dev/null +++ b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "filename" : "Egg.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Egg-1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Egg-1.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Egg.imageset/Egg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..72e744b36405c84dcb4ba1a30b4e13c7c44b0659 GIT binary patch literal 1821 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 VlQ7EpJ|_SG002ovPDHLkV1nYx5MclS literal 0 HcmV?d00001 diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Fish.imageset/Fish.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Fish.imageset/Fish.png new file mode 100644 index 0000000000000000000000000000000000000000..2953443b891e9f24139149760d31128f93581ab8 GIT binary patch literal 858 zcmV-g1Eu_lP)%a)FmDe4}yr$^g+afgeTWjg2aOdX~Y8}E{&8TY+81sGp6HVW)dl5 z(WprF_i{4lJOA(d=R0T4feab`b3*^JcoaA}&?Mpyb=!b;AUse5zk>ksfb)_hB~>-h z0bCqtQaMe060j0jfYtIKAmkxK4)*mK0;mBt0vCX;KQZ8OnJ)wm11qw#v!6+lbTt?p zdRN!=SHWQLi>~W0bX|)k5{dd$Dpjs&S^zi=Gy`v4a^?ZcfH^=9u-VPjIv}a4>b>bR zW>h$n@y2cP&gMPeotc$2tCVoKV6~zsPl5MXUHO(A;5g6=n7}*WfLrnXfC1=!zyH?d ztJf5O=G}Wo_oQ|G7pLmrPu zpFDX=W&gm5lc$8Ls&7J}P-D8{6Qj`zAw)0G3Ox1svaW1z+A&55p#xRv^sRtVTvD>} z+sT50v2}p4CEobcn{WL1(k85P97P1BYnlgTJ>9f$*uTyo9?s_n4{Se~X408|2J zvHo8ZFeORWPx&l}SWFR9Hvtmu+ZMXB5Z(C%LVX=5~Q3)kTxuwj@*$2||b6zN}l()y=_tVH9dH zIHoKzKZy9jjb(E(=x}U97@Nbvpp=G{k;z=vX^{*Ov{>0b^irx>uP~Ia`Qehz;dVC0PI*U`kbn&ikwK?ShIGm!(cFcPei9G0>Bu1N9z!PC7aF8C6meF zSSSj??d~ zt21sVq7fq6St)@2Xf(PsKR-WcwVL11>$x2UL*2%Og@t%7lNp(voBOS)sp%^K7l`O^ zIS^&f0Aox5a1p>3#u#KdaeHZrT@pnxkj)O?>gez(TEU5liGxn3^E&|V6Vb<|AW8x- z#!LXTp?Wu)&E^2q4h#%5dOV)#Ldhp5C*Esmah?Wnh=?u}gD48X7&{2yQ$2&hU z`SV};z21}IcszdEZnyUpO6>Rhjcsjh{emF84&Y^NE(*n#0=NR;B~?|miT~l=y*p@DoJ#$D+v(iASEs`+o_}VGs;X&OmM^DLsleFSSg^f) z`;gVzFi1q7uNoj6zAHC3x9s=%d|XdYPmjrDI$<`OHv?D#pi3s@zZ69se(*rL7z$mx z>h*e4E5&AJrf*uU>-wJxU}|bg76f5`eh1<3olhJN;i%v5@96IC9xc>e#Q^S0(vb~z z`xzoK7n|^k0Z5W`#9jrcDo|CRsz6nN|BV8YB+WE7HXg`-bjp1TqS5K=4Grs_&JU#1 zX}2uPXM@4uHy)4Y(aKc}AP@-H+-`SgeZ6tF(OCZ)$8jGJQ9=7w%96D%FCu#~nM^ts zi=7)EAOB+0Cf6RjU3mN)heDyPt*x!QYHDg;<#}GSV>$quPq+l&Ya)8MDo3>P5o62& z;240na=Dx?Da)df=Uub2v)|V9{JuJ)QM*qAxC&qpz~y2^^I=Nb^88@NSOWkr0BuFH z0Jsm}CjdVK2ocd^J638RSh;^9fILMu0&oHNgNWkg7W=oje*i!>T0dasnWF#z002ov JPDHLkV1k#B&{zNf literal 0 HcmV?d00001 diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Milk.imageset/Milk.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Milk.imageset/Milk.png new file mode 100644 index 0000000000000000000000000000000000000000..d740332ba49fad8e1245ce98766b19c4d61fe7db GIT binary patch literal 803 zcmV+;1Kj+HP)9mowoaN=7bG|zam-|EMR0*sD)DmXqrFvixhyw}WL?PzNA_^;kPGBpr3+NI>F;%N5 z&sUb0mzS27d_`pDtzj~!G-O$xb2y!`NTlV!;loikfY;I#?5qJd{f*=@*qQ2BLZK7wx#;$?E=&ygNscCH#Fo5w=6|2A% zU`3Lo1xb=t4jmfw<}!rCYsRw>LuSjPK%%Ou>Vu-F!=q=~gs$ zO#?JGHpc&43@#_U%8gE|)nUfQn+MlBwkM>gwwEyRkbjit(EU5QIW6&=Lcb zQe}WLKpCJ6PzLxXKsvp;Tx_@?2r1J5v$LPKdOV)d=#inkMy_4E_tfiwz@Vnp#lL)+ z?EozQH04k;5Cf93EYJJ>`b6)x?e0LJ;W#k+bJM0xo7-G&_c>KnpNgWGCi7sK1TK;p z-ApS0Tm|MW7R!Re>70}#Y2N4aU9GX%rn7~MzCO4T=C9Px*FG)l}R9HvFS9?&@RTTct%C;-(vcF}QbwMe>ZCwIgQIV!n3wI2m7}J@G5u29s zQO@LyB8olc*EBtbCL6TqY3LN>Xh2GuHaaj;%tTby7zAQ4zyKnTjg}v*yLg-H>@q7Y zB-rErd(S=RyZ1ZiJLeMq=SBZVe8$+*05XVZ>3+|WmZ;J+L0qi_>)e!Iy*a$8;!r+ERL+^IG-OZhyorkSfYqu|0PfyQ&olduah!))}fC@>H%!dyjSY)?v z>Eg~rQ8Z*{XIH6Is+iW6mLCj8qe(882e(|fu)-7@Tg`184#$3tMzffRtWyTS7<&o8 za}5m*t1K4FNx$0_DV53x+S}WgS}c~I_wL;rl9gpIxq6jF?b)+ut|*FEdwP0`bUGcU zVCj?qFveB_IMv{b*euJ^I=F^z^kq)z;R|OH52W z-__A^YG!!2gNPoPGyuk!iHnCMNi}I{X=#;}m7@yB0k~YQUZ>Ofu3oRt^*JvqD_gL7 z_39swA3r{?wzjrz+qP|;YPI@JB6@9702pIj)v5*u2e0Jj<|ggiw{KvqgTB7Lg9?RW zjoa;BE(pR8q9_WxckeFqcs$0uyu7%iq=fjClyu&BmJ`w08wS7_GXwb2?RE<#B_)e8 zGBR2M9Tr7VpPilk&GhNhP5pg+=LD_R#2CA!vGJGXad8W3E?v6xg27zkwifd z+G}cR_S-?$QHXK%l#QqACPcQkh<6e7mhG5{4rLqmu2^75YWSGm&CQbS5gO1(@b zlU&2Y9U&Ucl9ra1jOgg-LxEnWxw(0BR8-VE0PZHDYb7}$1zw?P7#J96)o3(H0r=h( z6f|w?v18?PGcz*>dV6~dr^#gTf>xV2)>ah7kexeoE-01L&lAy#iKKFr0&lJFDl03C zTeD_Oj#OV{N;;yY`2L&CCRlKty$a3&1<6 zT<-1dE!OMx0r@&{;>7Iag($tw^%HN0PI9` z-QKtqc!!1W&zw24%4V~jtf;6kMnpuUD-?>JsHmt?-@%54h9w3=*z<0;M{v1Z2O}dR zKlFFn+S-~P85vmy;C&)`YNDI__O4OjYq9zH`M1er4u{>otzM;?VI(5iZ%s|Pb8f#q zposVfsH>}cGB!5$Jper6?i;V{0#*TIY$Jg8ii(Of@$vC@TCLVohYlTxzULmBT^*v{ zC}@Q6@ovKtZqud>uNsXJeAF%gu!D#uoDuwe`Cfo0%*Q!7IpGNj2|`9jM!h6SCmCZF zNs<~32E+Ys9y z>gsBHYHDh`zq9J<>buNl^GiCNj-RUquz`rq-AKUkD9{7Abouh-tpKW_R>X0Sgz`V&6PbKhmN$5?)?>ag<24>Bgbxk-53kwB{#j@CBGOY><3bF}; zFyA|Fp8)Xo*x_=jApC`B*T~4o%Up(CF4qFBR%?>UWc(+?yCCmm^0WYE7nqGxJ17fOy00000NkvXXu0mjfq5cxR literal 0 HcmV?d00001 diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Soy.imageset/Soy.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Soy.imageset/Soy.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7d81daa11560848c40eb6bdbfbd05854ea01e7 GIT binary patch literal 1250 zcmV<81ReW{P)LfpAR#zK4a7MSBn$Y72r>xZVz?j(UXVzPfrW5EyqHJ~F=Qekgcw4&Kr;r6 zt#rqWGf3%L#?l&0{9nHB|9OAU`<(NB!T(gtfn)azJ|2hx2kr;l4x9uo0s6lI5QZS> zv<5JNC$b5x1GWR*Ko8K1HN&5Pr3ndD194z|VsK6d;1XaLQ15g){}M&=MN=i3l zmAn&c_D^RD2AB(&q9`3$`{BA_;AFYo?sG#)v}ObTI1p15rE|y5j@)|*@caEg0Ka7e zt^#KzNj|l;eVcNt@y!))JBy1;W_dh$8x6x~t{DHIkr<@wdIxYK8wnhhBj@1)!oioRXecOenx5o%y2j|J+aa2_3n{nxhE8k zQ~@l1y;+rIrPJkdomsi6MX)^D9x~i^rvc{JvHteNMnMpST!*7a)Ac*n^~{+sRsrUt zHIG#S`1A7*0sGPoE{pNMocbokr-`&ZnVfDIuhXV4rROddl3Fnk7^w`>)zUA;OH z_;mzMN(F$kvMhIR`f`h!%8-|rw_B2=Ubov*4e-I5wVvGE+@qo>cJJ8PAv82RTZOd* zpBybb1e_f+X3XW6=DZwCXKHI(ugkK0S`dV|rt2qcHd~L~ZtttCe5eM%FvhOI+Me%r zJ`7Vm&?`yOnW_mBD-$~&u6`t>Xj)2rRvP{dRtsB_2R-;UR43SUhg+Avd#k}O||4Gg3_3%=g9bJL9*eIDSAkrKEiJMg#HtEK&3 z4KtoAa5x;jvMitS`HVw=Sz21QDA^Z@R4l?O{jk2fsTwe&(W%n`CQX{`FE1}&T2vIA zm1rs}FR$@<@(%iZzGH=jg-enL88@!zd8}i1`)J@Wbi}TB>z#2cSG}t$it9p7PEH&! zOUuey?qz^TMa7aK_%TMg?7+G@nN3ZL)vBrq(*Uz^{=#5ELBTq=>b`ilz}D8)s^6dA zj#c({V8lB@DlGuak3Rm?Kd*5?1TZB@`cYAob3UK%P`aSv;*uAfPUm@`9~kyYMx%Pb zoHuWN4L~RqTBhszNw?eG`Aox%f@E`TZC#zFX-BYTeH@sW2^_3DdfaCi&FKu2CqESm z1Om-2m)ey8Zp;*%sN?zhf!iBLQ_~VpZEamt)3l8qkLTnN^cwITS-M;%tHoxs#T7-_ zt7%%dAPBJ`Xb*4@>qpJ{YbNnspaVyNo51f_CH@)s1-OxI@P9`C0NFVg;Hvg_IRF3v M07*qoM6N<$f`j)&*8l(j literal 0 HcmV?d00001 diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Contents.json b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Contents.json new file mode 100644 index 000000000..5a4396e7a --- /dev/null +++ b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "filename" : "Tree Nut.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Tree Nut-1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Tree Nut-1.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Tree Nut-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c47ccd304ff865f64801888bc347358967f49b GIT binary patch literal 2006 zcmV;{2Pyc8P)Px+kV!;AR9HvFmwQmu*A>UlMS%r(_qXq-xF}tsAx;5D>!ZY?kq8~K2tF#I(t;J0 zSV$8aA7Q#qGNCp;#>o1prD$EU?J$9{6d2turW%YPh%Hf6cG+FlF1x^weXs(H0=IK1 zWQ+lMq%*z$?3~~3obPAP{oZrW55fO=p_%GqjAZ~Y4*;A9A?r-@Od9}W91Z}50Pq?B zgaUvc0R9dD`w>ESrVBDH0E}@o0O&m)Pm9;U#?pF5E*=)Q@eEO8r%T ze_vB*=$s8rjg7Co5EXUl#*G_Pe0==in3%<4IT0Qno&f-h5kl=#ftV`5Nx$F!+V<_+ z7nhcn_Bfr+3MP}ejLBrmpAiY@>+Ss_Bs7#5Gx>i4fH95)fComSF*!0a@^5Ojn)&X# z2fMqwT`gjc0gQ1eP1Ey)LSY<9R(s`2QvAAgRW@5& zqe2nBWIO?<)1ecKB{GE2>hAmBGQmNqA`JzECWV zdOA5x(`AE$gMNub@>8eNd08wL6E9?b7XYKf;kY1^$=)AJ;%slPyIFsuVeQ&iH?ml) zZrv?MAcBdd8Vfyd)%tE{Zd z+p=Y|?t>2sSqg<>HpX~CR#sN?sZ*yG?Ao=fRjVylwzmG8E+{DI3J3^DL_)%?o*Xd2PD$=NB!Hi+h>P;p`O%1WKad z^Z7cAMq^%VZ0w&McKhcNne0=9(EgbKT($fGSL#jysP5|Os+c`Hz^2z53R6>49mU1Pb8>QW z`bffu58KKF0udb&60&Qw0&g%FjBGxiA5&gl{?djG8@>X72!xP%Ish*Mz}=dfny93t zq-ML_{tt?xYRbwkoZq%>=Qk=q)AXglz*#1W;=V-$j7H;T9*=vR&lkw^^Yb~!jvaF& zgjOJgZcYc_hX8QBsHjN3XV0GYfq{Wr4u_*8KR;hvQBmPOa^#43@7}$gBw<%q*QKDK zAQSNjiLX>wC#*?G_+-|sSrjRIZ?Df68p>25gvM>l6K%oz!NI{Az5Xv$Qc^}wUtiys z-CbQ5O=k0{RjXF{YHDg0t5hn}C_n{+!LYJetT#zqR8;ixjvYG;(b3U!nwy&+d%Yev zn@w$+=qOGEkbv><<$L$;^P{4oTsE8as!%94goK2=@AG-v^!m%Mr>1WHj0jpRtvW83 z-^1Z>a>fVny4h^@v;md@z!!%O9h$FJtF3Og`xAt)lf&WV+U@qwJ3Bj1#>B*Y{NHom zbMCQ!fXNpMx02XkxRS7X^_r0_C@U+QouX3t0)v9qO>`$rRDrp~;AJ{p+~)N3&uE%H zF)-i{m&@m>9FF!X1|y__%jN!t2ztHV_Z~fZv{EjYuO)GFbMsHcV$p|uz96iyurPez zzI_$|_&!3YX*wnhATxl&;W#Oi$v!fh&D+^*);j`$Q0a2HH2wYkGPzv7fh4?t|9+N8 zB-+p8@kTmfcX#*O7!Pj}2!ubl-O!K{y<|!0=zTzj*Ke)owPKCa>3mTtmBv?9RYfNy zCEfo0(WAoEiHYlFVPPMV3x{OWYPHL^Zrxg^(`mRF8Ncl5=x|;f9>&8`sWg+O=@LGl z&qD~QX3_~)k|9*5(=BRgX)zr*aKL--&YkQp8yg$4v$KsQB_$DASy^VaTFp3cV87d7 zs7*^uOe9UKb!h0xiGv3Vw5Ly>wg(0VW+Q|~{4%WykRM}=ulMxyJfbKnvA({3eRXwp zlUl8Ace~vWX_`KyR4V^Ken;kjSqOQ!eEu)=di`><+1!+pqB<@Ti4y=oi4gjFaD5hH zvVnwj#M@?*>9-L|<%sD<&;B{TzmF3Zrr1Q{l9CcmaB%SK^z?L^#Kbf6=g&VkmAP;# zGhqqlcIRxGFez0i^cj`aBwgwcMd}6 zuak+B@23PX3K0YV8v)?w01yiROaLIyh#ga7~l literal 0 HcmV?d00001 diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Tree Nut.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Tree Nut.imageset/Tree Nut.png new file mode 100644 index 0000000000000000000000000000000000000000..045171d34195de8917a45307e9066606901f3463 GIT binary patch literal 1538 zcmV+d2L1VoP)F-Gdnw7W~aOD?shK?-EOx_g^HybT9Jzq zS`1eKJqZnm7CmzC21JeDyk8RI2V;yT28kaOD^U_J5Mu-rBlUKIRZ%IILuqTTM_SHa z+P$?q)Yjg3ht+D8fMdX#>6n-*<^!QXV9rYb4?g^e zI)2hyTKWi(0+#<3;tJ3{YnJi>K-GfkdRdl7*59^K8c!-MEqxgnBE3Im6t9>}rmna4 zy=?(-xm+KZ&F0>Tq}K0$6lW>QG17Zt#!vz1b1Ev<0X*^4GpfNLC7e#@&woZCL%frVKRO?T(gAP*=Zl4WN6yrLC7saJk(3fiGr4+z03jYigHg1_}xbUj+1$67LTa z$)4iko!4DgwRppZO@7i{xcO=gJX=_3JNX9@Pw^qU-JWt36`hz!b~qdd+-~-rH00&U&Ep3&U9&A+cFU{rSgc?o*=DyN8W|a>2T;}gX5e-}p00rkAW*+@ z)%)WIw-t;%;iXGqAZ~%Rx~TOz2q$tYQ0N=NMw;~#iRy6N_&oVYPW{St7agV3?o*g@O{CZ(%s7#WK=Q2qa zi{+>G_OlBBV$s-9V9|69RBO843Xn)7=9yKs?W2!AR76pvtE(&8-{1H8&C8ZV0Ve{3 znWWLt(KC5@rV4=a@<1z4HJQ%kCJKOxs;ULQ0O-2zjYVUf$wUG{5b%0SwM#3uTEd}F zI1@{fbTXA1^8=K4OWFV%>DxIc1I2(zmgP1?p-^Bieern{V>bPfGSB6-Q7LI00x6W(==Ut_UR{wjYeaO#_fG7;e zMmf95`uloqR%<~p8jWg|*Um2tbcs!Qv$iTqBY(WtE0FE3!Tn$8lGr1bjfWx|`Z337#ukyR0p~1idyLLNVZud8l zNF;l@EnHaB77B&@cisJO3xLrmFOVd|DS+-@yEXuy0r6Z705lH_3@qQ=ux0M*)oXq+ z8jaDGmZSBH7cc!b5{bB*w%z3im^-iXM}t91_V@NI1<J%2!1fHu?rN`H4??{>7f3CZ`J8U+a z)le|#>+S7X77mB+OeT|Kz&*ghDb}7cWMB($g!IQpg7iv9f&T+7z`cNaxdMNNsdivI oRMLCH0+>jja$%tD;x#Ay4(_bb6%yP}YXATM07*qoM6N<$f(zf>asU7T literal 0 HcmV?d00001 diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Contents.json b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Contents.json new file mode 100644 index 000000000..fe8a60f64 --- /dev/null +++ b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "filename" : "Wheat:Gluten.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Wheat.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Wheat.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Wheat.png new file mode 100644 index 0000000000000000000000000000000000000000..b1fc981c38dde3855aa953edaf38096cf6c80aa5 GIT binary patch literal 1202 zcmV;j1Wo&iP)Px(Y)M2xR9HvFmu*a&RTRhnr)4EDULP7ZLFim(v(atH7fm)ZhGfpD1e^&375BlH zC^239AYx`ThGZ`vNHYW-AC$0cx`0lLEO7*JQ(4S3>JU1C!WyEzS^78U401gt-p?d{zI2;aFH8eD&IvfuF*w|RV*=!ylqM{WAVCEbE zvqUry8JL-CL!rBX+y} zow~ZZq{_<5F{9DgPDIbH6o9Pss?XBC6`4Ao}QZvzYrG}pD{HxCE9pO zQPLg;@T-)q)W24SK_bf13m`@!wY&+y5dhs<3BCeAgc#XG3!i8J0`e9B1Au%YlG6Rp zwxkG|c|CwX0hqN2lK?&f@F4&xQ4@e30Hpxl1|Z|-+qT6fmqAMcXkPH;?99v)-<~^H zke8RYKQlA)H2`w*W+nAQm*+P~D~QEMO~6Gs75g+d`U7@X=b z7>tjZOr{i7Ra+7h6Lw2U0yqPpjEH7e96-y&K~gP-vorG25^WZA0ccwx zmyNG9%at3`UEOXm7~KFGgq#iASMy~gZ^Ko6nyvcdR8C3p{NJJ#-NJGI04VapFc70z QO#lD@07*qoM6N<$f{v#kwg3PC literal 0 HcmV?d00001 diff --git a/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Wheat:Gluten.png b/PennMobile/Assets.xcassets/Dining/Dining Menu Icons/Wheat.imageset/Wheat:Gluten.png new file mode 100644 index 0000000000000000000000000000000000000000..d59753b4b859f19b215a47a90335f3fe032d4c9e GIT binary patch literal 889 zcmV-<1BU#GP)!RoI7*A@6H7^EC)6#awy>j(5pfa4#32Z|7jo&%uwW*H0l81T`kist^x0o z$z)G78odvE1DxqJP!EWORaINJ@7Pg+d#(^|*T9=;)~a>C@-Rin$kkj!sFap%781PMe;djgR z18qP%kOy4gktfrUFA65SC@#`c+8JJL#Da zwms{PUoTCk{rZOSB$L4kSHHd*Ae$}Q9S(={$kzih zkPRvZ9wCF~uci|adMx(ZFjDQNX}yibVy8@0R~V73|3={!bW2dfc)wahGASia`c#e z?fT6bx~>la;^4v7ip^WL>1Ac*Cp_^hL5ur11qfZ&KO08sRw9uY)OFo;9H(>U%=iaS zybHNuO&Mx|7k~(bLc;sa0|P+gR0@y9;ZP_fYHC*InwocI6N$tS0f%lP6e3rgNACG9 ze}1$~IZBXYcL0TfqY{?)z)R%8) -> Void) { - getRequestData(url: diningMenuUrl + "\(id)") { (data, _, statusCode) in + func fetchDiningMenu(for id: Int, at date: Date = Date(), _ completion: @escaping (_ result: Result) -> Void) { + print(Date.dayOfMonthFormatter.string(from: date)) + postRequestData(url: diningMenuUrl + "\(id)/", params: ["date": Date.dayOfMonthFormatter.string(from: date)]) { (data, _, statusCode) in if statusCode == nil { return completion(.failure(.noInternet)) } diff --git a/PennMobile/Dining/SwiftUI/DiningViewModelSwiftUI.swift b/PennMobile/Dining/SwiftUI/DiningViewModelSwiftUI.swift index 677070bca..929ce4714 100644 --- a/PennMobile/Dining/SwiftUI/DiningViewModelSwiftUI.swift +++ b/PennMobile/Dining/SwiftUI/DiningViewModelSwiftUI.swift @@ -6,6 +6,7 @@ // Copyright © 2020 PennLabs. All rights reserved. // +import Foundation import SwiftUI class DiningViewModelSwiftUI: ObservableObject { @@ -32,9 +33,7 @@ class DiningViewModelSwiftUI: ObservableObject { let lastRequest = UserDefaults.standard.getLastDiningHoursRequest() // Sometimes when building the app, dining venue list is empty, but because it has refreshed within the day, it does not refresh again. Now, refreshes if the list of venues is completely empty - if lastRequest == nil || !lastRequest!.isToday || diningVenues.filter({ _, value in - !value.isEmpty - }).isEmpty { + if lastRequest == nil || !lastRequest!.isToday || diningVenues.isEmpty { self.diningVenuesIsLoading = true DiningAPI.instance.fetchDiningHours { result in @@ -56,9 +55,9 @@ class DiningViewModelSwiftUI: ObservableObject { } } - func refreshMenu(for id: Int) { + func refreshMenu(for id: Int, at date: Date = Date()) { let lastRequest = UserDefaults.standard.getLastMenuRequest(id: id) - if lastRequest == nil || !lastRequest!.isToday { + if Calendar.current.isDate(date, inSameDayAs: Date()) && (lastRequest == nil || !lastRequest!.isToday) { DiningAPI.instance.fetchDiningMenu(for: id) { result in switch result { case .success(let diningMenu): @@ -69,24 +68,34 @@ class DiningViewModelSwiftUI: ObservableObject { self.alertType = error } } + } else { + DiningAPI.instance.fetchDiningMenu(for: id, at: date) { result in + switch result { + case .success(let diningMenu): + withAnimation { + self.diningMenus[id] = diningMenu + } + case .failure(let error): + self.alertType = error + } + } } } func refreshBalance() { - guard let diningToken = KeychainAccessible.instance.getDiningToken() else { - UserDefaults.standard.clearDiningBalance() - self.diningBalance = DiningBalance(diningDollars: "0.0", regularVisits: 0, guestVisits: 0, addOnVisits: 0) + guard let diningToken = KeychainAccessible.instance.getDiningToken() else { + UserDefaults.standard.clearDiningBalance() + self.diningBalance = DiningBalance(diningDollars: "0.0", regularVisits: 0, guestVisits: 0, addOnVisits: 0) + return + } + + DiningAPI.instance.getDiningBalance(diningToken: diningToken) { balance in + guard let balance = balance else { return } - - print(diningToken) - DiningAPI.instance.getDiningBalance(diningToken: diningToken) { balance in - guard let balance = balance else { - return - } - UserDefaults.standard.setdiningBalance(balance) - self.diningBalance = balance - } + UserDefaults.standard.setdiningBalance(balance) + self.diningBalance = balance + } } // MARK: - Insights diff --git a/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailMenuView.swift b/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailMenuView.swift index 5ffc6af53..b266159d3 100644 --- a/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailMenuView.swift +++ b/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailMenuView.swift @@ -10,8 +10,17 @@ import SwiftUI struct DiningVenueDetailMenuView: View { var menus: [DiningMenu] + var id: Int + @State var menuDate = Date() + @EnvironmentObject var diningVM: DiningViewModelSwiftUI var body: some View { + DatePicker(selection: $menuDate, in: Date()...Date().addingTimeInterval(86400 * 6), displayedComponents: .date) { + Text("Menu date") + }.onChange(of: menuDate) { newMenuDate in + diningVM.refreshMenu(for: id, at: newMenuDate) + } + ForEach(menus, id: \.self) { menu in DiningMenuRow(for: menu) .transition(.opacity) @@ -26,7 +35,7 @@ struct DiningVenueDetailMenuView_Previews: PreviewProvider { return NavigationView { ScrollView { VStack { - DiningVenueDetailMenuView(menus: []) + DiningVenueDetailMenuView(menus: [], id: 1) Spacer() } }.navigationTitle("Dining") diff --git a/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailView.swift b/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailView.swift index e015f4afd..d458374ce 100644 --- a/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailView.swift +++ b/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailView.swift @@ -92,7 +92,7 @@ struct DiningVenueDetailView: View { VStack { if self.pickerIndex == 0 { - DiningVenueDetailMenuView(menus: diningVM.diningMenus[venue.id]?.document.menuDocument.menus ?? []) + DiningVenueDetailMenuView(menus: diningVM.diningMenus[venue.id]?.document.menuDocument.menus ?? [], id: venue.id) } else if self.pickerIndex == 1 { DiningVenueDetailHoursView(for: venue) } else { diff --git a/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/MenuDisclosureGroup.swift b/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/MenuDisclosureGroup.swift index 8f3d79188..063e11b7e 100644 --- a/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/MenuDisclosureGroup.swift +++ b/PennMobile/Dining/SwiftUI/Views/Venue/Detail View/MenuDisclosureGroup.swift @@ -44,7 +44,7 @@ struct DiningMenuRow: View { self.diningMenu = diningMenu } - @State var isExpanded = false + @State var isExpanded = true let diningMenu: DiningMenu var body: some View { @@ -105,7 +105,9 @@ struct DiningStationItemRow: View { ForEach(diningStationItem.tableAttribute.attributeDescriptions, id: \.self) { attribute in // Unlike UIKit, image will simply not appear if it doesn't exist in assets - Image(attribute.description) + // Hack as image set doesn't allow slashes + let description = attribute.description == "Wheat/Gluten" ? "Wheat" : attribute.description + Image(description) .resizable() .scaledToFit() .frame(width: 20.0, height: 20) @@ -142,7 +144,7 @@ struct MenuDisclosureGroup_Previews: PreviewProvider { return NavigationView { ScrollView { VStack { - DiningVenueDetailMenuView(menus: diningVenues.document.menuDocument.menus) + DiningVenueDetailMenuView(menus: diningVenues.document.menuDocument.menus, id: 1) Spacer() } }.navigationTitle("Dining")