Skip to content

Commit b89e4cf

Browse files
committed
Merge branch 'native-dining-menus' into widget/dining-analytics
2 parents 0830575 + 6c27164 commit b89e4cf

15 files changed

Lines changed: 367 additions & 266 deletions

File tree

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"info" : {
3-
"version" : 1,
4-
"author" : "xcode"
3+
"author" : "xcode",
4+
"version" : 1
55
}
6-
}
6+
}
Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,36 @@
11
{
2-
"info" : {
3-
"version" : 1,
4-
"author" : "xcode"
5-
},
62
"colors" : [
73
{
8-
"idiom" : "universal",
94
"color" : {
105
"platform" : "ios",
116
"reference" : "systemGray6Color"
12-
}
7+
},
8+
"idiom" : "universal"
139
},
1410
{
15-
"idiom" : "universal",
1611
"appearances" : [
1712
{
1813
"appearance" : "luminosity",
1914
"value" : "dark"
2015
}
2116
],
2217
"color" : {
23-
"platform" : "ios",
24-
"reference" : "systemGray6Color"
25-
}
18+
"color-space" : "srgb",
19+
"components" : {
20+
"alpha" : "1.000",
21+
"blue" : "0.118",
22+
"green" : "0.110",
23+
"red" : "0.110"
24+
}
25+
},
26+
"idiom" : "universal"
2627
}
27-
]
28-
}
28+
],
29+
"info" : {
30+
"author" : "xcode",
31+
"version" : 1
32+
},
33+
"properties" : {
34+
"localizable" : true
35+
}
36+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"colors" : [
3+
{
4+
"color" : {
5+
"color-space" : "srgb",
6+
"components" : {
7+
"alpha" : "1.000",
8+
"blue" : "250",
9+
"green" : "250",
10+
"red" : "250"
11+
}
12+
},
13+
"idiom" : "universal"
14+
},
15+
{
16+
"appearances" : [
17+
{
18+
"appearance" : "luminosity",
19+
"value" : "dark"
20+
}
21+
],
22+
"color" : {
23+
"color-space" : "srgb",
24+
"components" : {
25+
"alpha" : "1.000",
26+
"blue" : "0.060",
27+
"green" : "0.055",
28+
"red" : "0.055"
29+
}
30+
},
31+
"idiom" : "universal"
32+
}
33+
],
34+
"info" : {
35+
"author" : "xcode",
36+
"version" : 1
37+
}
38+
}
Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
11
{
2-
"info" : {
3-
"version" : 1,
4-
"author" : "xcode"
5-
},
62
"colors" : [
73
{
8-
"idiom" : "universal",
94
"color" : {
105
"platform" : "ios",
116
"reference" : "systemBackgroundColor"
12-
}
7+
},
8+
"idiom" : "universal"
139
},
1410
{
15-
"idiom" : "universal",
1611
"appearances" : [
1712
{
1813
"appearance" : "luminosity",
1914
"value" : "dark"
2015
}
2116
],
2217
"color" : {
23-
"platform" : "ios",
24-
"reference" : "systemBackgroundColor"
25-
}
18+
"color-space" : "extended-gray",
19+
"components" : {
20+
"alpha" : "1.000",
21+
"white" : "0.000"
22+
}
23+
},
24+
"idiom" : "universal"
2625
}
27-
]
28-
}
26+
],
27+
"info" : {
28+
"author" : "xcode",
29+
"version" : 1
30+
}
31+
}

PennMobile/Dining/SwiftUI/DiningViewModelSwiftUI.swift

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,30 @@ class DiningViewModelSwiftUI: ObservableObject {
4444
}
4545
}
4646

47-
func refreshMenu(for id: Int, at date: Date = Date()) {
48-
let lastRequest = UserDefaults.standard.getLastMenuRequest(id: id)
49-
if Calendar.current.isDate(date, inSameDayAs: Date()) && (lastRequest == nil || !lastRequest!.isToday) {
50-
DiningAPI.instance.fetchDiningMenu(for: id) { result in
51-
switch result {
52-
case .success(let diningMenu):
53-
withAnimation {
54-
self.diningMenus[id] = diningMenu
47+
func refreshMenus(cache: Bool?, at date: Date = Date()) async {
48+
let lastRequest = UserDefaults.standard.getLastCachedMenuRequest()
49+
if diningMenus.isEmpty || !Calendar.current.isDate(date, inSameDayAs: Date()) || (lastRequest == nil || !lastRequest!.isToday) {
50+
let result = await DiningAPI.instance.fetchDiningMenus(at: date)
51+
switch result {
52+
case .success(let response):
53+
withAnimation {
54+
for id in DiningVenue.menuUrlDict.keys {
55+
self.diningMenus[id] = MenuList(menus: [])
5556
}
56-
case .failure(let error):
57-
self.alertType = error
58-
}
59-
}
60-
} else {
61-
DiningAPI.instance.fetchDiningMenu(for: id, at: date) { result in
62-
switch result {
63-
case .success(let diningMenu):
64-
withAnimation {
65-
self.diningMenus[id] = diningMenu
57+
for venueMenus in response {
58+
self.diningMenus[venueMenus.menus[0].venueInfo.id] = venueMenus
6659
}
67-
case .failure(let error):
68-
self.alertType = error
6960
}
61+
if cache != nil && cache! {
62+
DiningAPI.instance.saveAllMenusToCache(menus: self.diningMenus)
63+
UserDefaults.standard.setLastCachedMenuRequest(date)
64+
}
65+
case .failure(let error):
66+
self.alertType = error
7067
}
68+
} else {
69+
// getting menus from cache
70+
self.diningMenus = DiningAPI.instance.getMenus()
7171
}
7272
}
7373

PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailMenuView.swift

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,79 @@ import WebKit
1212
struct DiningVenueDetailMenuView: View {
1313
var menus: [DiningMenu]
1414
var id: Int
15-
@State var menuDate = Date()
16-
@State private var showMenu = false
15+
var venue: DiningVenue?
16+
@State var menuDate: Date
17+
@State private var menuIndex: Int
18+
@State private var showMenu: Bool
1719
@EnvironmentObject var diningVM: DiningViewModelSwiftUI
20+
init(menus: [DiningMenu], id: Int, venue: DiningVenue? = nil, menuDate: Date = Date(), showMenu: Bool = false) {
21+
self.menus = menus
22+
self.id = id
23+
self.venue = venue
24+
_showMenu = State(initialValue: showMenu)
25+
_menuDate = State(initialValue: menuDate)
26+
_menuIndex = State(initialValue: 0)
27+
_menuIndex = State(initialValue: self.getIndex())
28+
}
29+
func getIndex() -> Int {
30+
var inx = 0
31+
if self.venue != nil && Calendar.current.isDate(self.menuDate, inSameDayAs: Date()) {
32+
if let meal = self.venue!.currentOrNearestMeal {
33+
inx = self.menus.firstIndex { $0.service == meal.label } ?? inx
34+
}
35+
}
36+
return inx
37+
}
1838

1939
var body: some View {
2040
DatePicker(selection: $menuDate, in: Date()...Date().addingTimeInterval(86400 * 6), displayedComponents: .date) {
2141
Text("Menu date")
2242
}.onChange(of: menuDate) { newMenuDate in
23-
diningVM.refreshMenu(for: id, at: newMenuDate)
24-
}
25-
VStack(alignment: .leading, spacing: 10) {
26-
Text("Penn has recently changed the process in which Penn Labs can access menu data. We are working as fast as possible to fix this. We apologize for the inconvenience.")
27-
Text("In the meantime, we have directly linked the menu below.")
43+
menuIndex = 0
44+
Task.init() {
45+
await diningVM.refreshMenus(cache: false, at: newMenuDate)
46+
}
47+
if Calendar.current.isDate(newMenuDate, inSameDayAs: Date()) {
48+
menuIndex = getIndex()
49+
}
2850
}
29-
// ForEach(menus, id: \.self) { menu in
30-
// DiningMenuRow(for: menu)
31-
// .transition(.opacity)
32-
// }
33-
Button {
34-
showMenu.toggle()
35-
} label: {
36-
CardView {
37-
HStack {
38-
Text("Menu")
39-
.font(.system(size: 20, design: .rounded))
40-
.bold()
41-
Spacer()
42-
Image(systemName: "chevron.right")
51+
VStack {
52+
Button {
53+
showMenu.toggle()
54+
} label: {
55+
CardView {
56+
HStack {
57+
Text("Menu")
58+
.font(.system(size: 20, design: .rounded))
59+
.bold()
60+
Spacer()
61+
Image(systemName: "chevron.right")
62+
}
63+
.padding()
64+
.foregroundColor(.blue).font(Font.system(size: 24).weight(.bold))
4365
}
44-
.padding()
45-
.foregroundColor(.blue).font(Font.system(size: 24).weight(.bold))
66+
.frame(height: 24)
67+
.padding([.top, .bottom])
68+
}
69+
.sheet(isPresented: $showMenu) {
70+
MenuWebView(url: URL(string: DiningVenue.menuUrlDict[id] ?? "https://university-of-pennsylvania.cafebonappetit.com/")!)
71+
}
72+
if menus.count > 0 {
73+
Picker("Menu", selection: self.$menuIndex) {
74+
ForEach(0 ..< menus.count, id: \.self) {
75+
Text(menus[$0].service)
76+
}
77+
}
78+
.pickerStyle(SegmentedPickerStyle())
79+
DiningMenuRow(diningMenu: menus[menuIndex])
80+
.transition(.opacity)
4681
}
47-
.frame(height: 24)
48-
.padding([.top])
49-
}
50-
.sheet(isPresented: $showMenu) {
51-
MenuWebView(url: URL(string: DiningVenue.menuUrlDict[id] ?? "https://university-of-pennsylvania.cafebonappetit.com/")!)
5282
}
5383
}
5484
}
5585

5686
struct DiningVenueDetailMenuView_Previews: PreviewProvider {
57-
let diningVenues: DiningMenuAPIResponse = Bundle.main.decode("mock_menu.json")
87+
let diningVenues: MenuList = Bundle.main.decode("mock_menu.json")
5888

5989
static var previews: some View {
6090
return NavigationView {

PennMobile/Dining/SwiftUI/Views/Venue/Detail View/DiningVenueDetailView.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ struct DiningVenueDetailView: View {
8484

8585
VStack {
8686
if self.pickerIndex == 0 {
87-
DiningVenueDetailMenuView(menus: diningVM.diningMenus[venue.id]?.document.menuDocument.menus ?? [], id: venue.id)
87+
DiningVenueDetailMenuView(menus: diningVM.diningMenus[venue.id]?.menus ?? [], id: venue.id, venue: venue)
8888
} else if self.pickerIndex == 1 {
8989
DiningVenueDetailHoursView(for: venue)
9090
} else {
@@ -99,7 +99,6 @@ struct DiningVenueDetailView: View {
9999
.navigationBarHidden(true)
100100
.onAppear {
101101
FirebaseAnalyticsManager.shared.trackScreen("Venue Detail View")
102-
diningVM.refreshMenu(for: venue.id)
103102
}
104103
}
105104
}

0 commit comments

Comments
 (0)