Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
adisve committed Jan 26, 2023
2 parents 2551d0b + 20a967a commit 6373aa6
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 64 deletions.
20 changes: 8 additions & 12 deletions tumble-ios.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,9 @@
D40E843D2981C8B200C2CF2E /* AccountPageView-ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D40E843C2981C8B200C2CF2E /* AccountPageView-ViewModel.swift */; };
D40E84422981E4E100C2CF2E /* ScheduleCalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D40E84412981E4E100C2CF2E /* ScheduleCalendarView.swift */; };
D412F4542982D35F003154CC /* BottomBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D412F4532982D35F003154CC /* BottomBarItem.swift */; };
D423321A29827C4E00F6CE9C /* ElegantCalendar.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D423321929827C4E00F6CE9C /* ElegantCalendar.xcassets */; };
D4239079293686D7005A95D7 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4239078293686D7005A95D7 /* Color.swift */; };
D43E680229820C9700124F72 /* ElegantCalendar in Frameworks */ = {isa = PBXBuildFile; productRef = D43E680129820C9700124F72 /* ElegantCalendar */; };
D43E680429820CBF00124F72 /* ElegantCalendar.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D43E680329820CBF00124F72 /* ElegantCalendar.xcassets */; };
D45338F429280C4800198411 /* SchedulePreviewView-ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D45338F329280C4800198411 /* SchedulePreviewView-ViewModel.swift */; };
D45338F629280E8400198411 /* ScheduleExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D45338F529280E8400198411 /* ScheduleExtensions.swift */; };
D45338F9292825B200198411 /* ScheduleCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D45338F8292825B200198411 /* ScheduleCardView.swift */; };
D45338FB2929730200198411 /* CustomProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D45338FA2929730200198411 /* CustomProgressView.swift */; };
Expand Down Expand Up @@ -63,7 +62,7 @@
D472215F292455710063BDB7 /* APITypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D472215C292455710063BDB7 /* APITypes.swift */; };
D4722160292455710063BDB7 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = D472215D292455710063BDB7 /* API.swift */; };
D4722161292455710063BDB7 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = D472215E292455710063BDB7 /* APIClient.swift */; };
D476BD2A293A31FD0027CFE8 /* SchedulePreviewGrouperListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D476BD29293A31FD0027CFE8 /* SchedulePreviewGrouperListView.swift */; };
D476BD2A293A31FD0027CFE8 /* SchedulePreviewListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D476BD29293A31FD0027CFE8 /* SchedulePreviewListView.swift */; };
D476BD2C293A326C0027CFE8 /* SchedulePreviewCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D476BD2B293A326C0027CFE8 /* SchedulePreviewCardView.swift */; };
D476BD2E293A32BF0027CFE8 /* RoundedCornerShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = D476BD2D293A32BF0027CFE8 /* RoundedCornerShape.swift */; };
D48F0D8829367A7F0039CD0F /* CourseColorStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D48F0D8729367A7F0039CD0F /* CourseColorStore.swift */; };
Expand Down Expand Up @@ -119,9 +118,8 @@
D40E843C2981C8B200C2CF2E /* AccountPageView-ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AccountPageView-ViewModel.swift"; sourceTree = "<group>"; };
D40E84412981E4E100C2CF2E /* ScheduleCalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ScheduleCalendarView.swift; path = "tumble-ios/Core/Views/Schedule/Calendar/ScheduleCalendarView.swift"; sourceTree = SOURCE_ROOT; };
D412F4532982D35F003154CC /* BottomBarItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BottomBarItem.swift; path = ../../../../../../../.Trash/BottomBarItem.swift; sourceTree = "<group>"; };
D423321929827C4E00F6CE9C /* ElegantCalendar.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = ElegantCalendar.xcassets; path = "../../Library/Developer/Xcode/DerivedData/tumble-ios-fexkmcwqhbcmhwhafpnwukjkdktx/SourcePackages/checkouts/ElegantCalendar/ElegantCalendar.xcassets"; sourceTree = "<group>"; };
D4239078293686D7005A95D7 /* Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = "<group>"; };
D43E680329820CBF00124F72 /* ElegantCalendar.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = ElegantCalendar.xcassets; path = "../../Library/Developer/Xcode/DerivedData/tumble-ios-bmdzgpsrrlqprxfymxolonszzycj/SourcePackages/checkouts/ElegantCalendar/ElegantCalendar.xcassets"; sourceTree = "<group>"; };
D45338F329280C4800198411 /* SchedulePreviewView-ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SchedulePreviewView-ViewModel.swift"; sourceTree = "<group>"; };
D45338F529280E8400198411 /* ScheduleExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleExtensions.swift; sourceTree = "<group>"; };
D45338F8292825B200198411 /* ScheduleCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleCardView.swift; sourceTree = "<group>"; };
D45338FA2929730200198411 /* CustomProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomProgressView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -150,7 +148,7 @@
D472215C292455710063BDB7 /* APITypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APITypes.swift; sourceTree = "<group>"; };
D472215D292455710063BDB7 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = "<group>"; };
D472215E292455710063BDB7 /* APIClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = "<group>"; };
D476BD29293A31FD0027CFE8 /* SchedulePreviewGrouperListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchedulePreviewGrouperListView.swift; sourceTree = "<group>"; };
D476BD29293A31FD0027CFE8 /* SchedulePreviewListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchedulePreviewListView.swift; sourceTree = "<group>"; };
D476BD2B293A326C0027CFE8 /* SchedulePreviewCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchedulePreviewCardView.swift; sourceTree = "<group>"; };
D476BD2D293A32BF0027CFE8 /* RoundedCornerShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedCornerShape.swift; sourceTree = "<group>"; };
D48F0D8729367A7F0039CD0F /* CourseColorStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseColorStore.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -266,7 +264,6 @@
D40D80A829252688008CA68D /* AppNavigatorView-ViewModel.swift */,
D40D80C42925B97F008CA68D /* DrawerView-ViewModel.swift */,
D40D80CB29265C36008CA68D /* SearchView-ViewModel.swift */,
D45338F329280C4800198411 /* SchedulePreviewView-ViewModel.swift */,
D460763C292AAE7800DE9590 /* RootView-ViewModel.swift */,
D4607642292AB1C000DE9590 /* HomePageView-ViewModel.swift */,
D40CC162292AFE7200664776 /* SchedulePageMainView-ViewModel.swift */,
Expand Down Expand Up @@ -446,7 +443,7 @@
D472213C292454560063BDB7 = {
isa = PBXGroup;
children = (
D43E680329820CBF00124F72 /* ElegantCalendar.xcassets */,
D423321929827C4E00F6CE9C /* ElegantCalendar.xcassets */,
D496CC5E298206710025C52A /* Packages */,
D4722147292454560063BDB7 /* tumble-ios */,
D4722146292454560063BDB7 /* Products */,
Expand Down Expand Up @@ -532,7 +529,7 @@
children = (
D460764D292AF21900DE9590 /* SchedulePreviewView.swift */,
D4CF9B272935633800DDB5F0 /* SchedulePreviewError.swift */,
D476BD29293A31FD0027CFE8 /* SchedulePreviewGrouperListView.swift */,
D476BD29293A31FD0027CFE8 /* SchedulePreviewListView.swift */,
D476BD2B293A326C0027CFE8 /* SchedulePreviewCardView.swift */,
);
path = Preview;
Expand Down Expand Up @@ -665,12 +662,12 @@
files = (
D4D4DD1A2927CA780083BB7F /* roboto.ttf in Resources */,
D4D4DD162927CA780083BB7F /* roboto_black_italic.ttf in Resources */,
D43E680429820CBF00124F72 /* ElegantCalendar.xcassets in Resources */,
D4D4DD1D2927CA780083BB7F /* roboto_regular.ttf in Resources */,
D4D4DD1B2927CA780083BB7F /* roboto_thin_italic.ttf in Resources */,
D4D4DD1C2927CA780083BB7F /* roboto_light.ttf in Resources */,
D4D4DD1E2927CA780083BB7F /* roboto_light_italic.ttf in Resources */,
D4D4DD142927CA780083BB7F /* roboto_thin.ttf in Resources */,
D423321A29827C4E00F6CE9C /* ElegantCalendar.xcassets in Resources */,
D4D4DD152927CA780083BB7F /* roboto_black.ttf in Resources */,
D4D4DD182927CA780083BB7F /* roboto_bold_italic.ttf in Resources */,
D4D4DD192927CA780083BB7F /* roboto_medium.ttf in Resources */,
Expand Down Expand Up @@ -726,7 +723,7 @@
D40D80BE29258CAF008CA68D /* BottomBarView.swift in Sources */,
D4607645292AC41D00DE9590 /* SearchResultsView.swift in Sources */,
D45338F9292825B200198411 /* ScheduleCardView.swift in Sources */,
D476BD2A293A31FD0027CFE8 /* SchedulePreviewGrouperListView.swift in Sources */,
D476BD2A293A31FD0027CFE8 /* SchedulePreviewListView.swift in Sources */,
D48F0D8A29367CAF0039CD0F /* Colors.swift in Sources */,
D4CF9B2229353FC800DDB5F0 /* HomePageLinkSectionView.swift in Sources */,
D4607632292AA39400DE9590 /* Types.swift in Sources */,
Expand Down Expand Up @@ -755,7 +752,6 @@
D4CF9B242935405200DDB5F0 /* HomePageLinkOptionView.swift in Sources */,
D4607641292AB18D00DE9590 /* HomePageView.swift in Sources */,
D460764E292AF21900DE9590 /* SchedulePreviewView.swift in Sources */,
D45338F429280C4800198411 /* SchedulePreviewView-ViewModel.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
29 changes: 26 additions & 3 deletions tumble-ios/Core/Extensions/ScheduleExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@ import SwiftUI
let inDateFormatter = ISO8601DateFormatter()

extension [API.Types.Response.Schedule] {

func flatten() -> [DayUiModel] {
inDateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
var days: [DayUiModel] = []
self.forEach { schedule in
days.append(contentsOf: schedule.days.reduce(into: []) {
if inDateFormatter.date(from: $1.isoString)! >= Date() {$0.append($1)}}.toUiModel())
let day = Calendar.current.dateComponents([.day], from: inDateFormatter.date(from: $1.isoString)!).day!
let today = Calendar.current.dateComponents([.day], from: Date.now).day!
if day >= today {$0.append($1)}}.toUiModel())
}
return days.compactMap { $0 }.merge().sorted(by: {inDateFormatter.date(from: $0.isoString)! < inDateFormatter.date(from: $1.isoString)!})
return days.toOrderedDayUiModels()
}

func removeDuplicateEvents() -> [API.Types.Response.Schedule] {
Expand All @@ -46,7 +49,7 @@ extension [API.Types.Response.Schedule] {
}

extension API.Types.Response.Schedule {
func assignCoursesColors() -> [String : [String : Color]] {
func assignRandomCoursesColors() -> [String : [String : Color]] {
var coursesColors: [String : [String : Color]] = [:]
for day in self.days {
for event in day.events {
Expand All @@ -58,6 +61,8 @@ extension API.Types.Response.Schedule {
}
return coursesColors
}


}

extension [DayUiModel] {
Expand All @@ -76,6 +81,13 @@ extension [DayUiModel] {
}
return days
}

func toOrderedDayUiModels() -> [DayUiModel] {
return self.compactMap { $0 }.merge().sorted(by: {
// Ascending order
inDateFormatter.date(from: $0.isoString)! < inDateFormatter.date(from: $1.isoString)!
})
}
}

extension [API.Types.Response.Day] {
Expand All @@ -84,6 +96,17 @@ extension [API.Types.Response.Day] {
return DayUiModel(name: day.name, date: day.date, isoString: day.isoString, weekNumber: day.weekNumber, events: day.events)
}
}


func toOrderedDays() -> [DayUiModel] {
inDateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
var days: [DayUiModel] = []
days.append(contentsOf: self.reduce(into: []) {
let day = Calendar.current.dateComponents([.day], from: inDateFormatter.date(from: $1.isoString)!).day!
let today = Calendar.current.dateComponents([.day], from: Date.now).day!
if day >= today {$0.append($1)}}.toUiModel())
return days.toOrderedDayUiModels()
}
}

extension API.Types.Response.Event {
Expand Down
23 changes: 0 additions & 23 deletions tumble-ios/Core/ViewModels/SchedulePreviewView-ViewModel.swift

This file was deleted.

24 changes: 23 additions & 1 deletion tumble-ios/Core/ViewModels/SearchView-ViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,13 @@ extension SearchParentView {
@Published var numberOfSearchResults: Int = 0
@Published var searchResults: [API.Types.Response.Programme] = []
@Published var scheduleForPreview: API.Types.Response.Schedule? = nil
@Published var scheduleListOfDays: [DayUiModel]? = nil
@Published var presentPreview: Bool = false
@Published var previewDelegateStatus: PreviewDelegateStatus = .loading
@Published var school: School? = UserDefaults.standard.getDefaultSchool()
@Published var schedulePreviewIsSaved: Bool = false
@Published var courseColors: [String : String] = [:]

private var store: ScheduleStore = ScheduleStore()
private var client: API.Client = API.Client.shared

private func checkSavedSchedule(scheduleId: String) -> Void {
Expand Down Expand Up @@ -132,6 +133,8 @@ extension SearchParentView {
switch result {
case .success(let schedule):
self.scheduleForPreview = schedule
self.scheduleListOfDays = schedule.days.toOrderedDays()
self.initCourseColors()
self.presentPreview = true
self.previewDelegateStatus = .loaded
case .failure(_):
Expand All @@ -141,6 +144,25 @@ extension SearchParentView {
}
}

func initCourseColors() -> Void {
for day in self.scheduleListOfDays! {
for event in day.events {
CourseColorStore.load { result in
DispatchQueue.main.async {
switch result {
case .failure(_):
print("Error on course with id: \(event.course.id)")
case .success(let courses):
if !courses.isEmpty {
self.courseColors = courses
}
}
}
}
}
}
}


// Private functions
private func parseSearchResults(_ results: API.Types.Response.Search) -> Void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@

import SwiftUI

struct SchedulePreviewGrouperListView: View {
struct SchedulePreviewListView: View {
@State var toggled: Bool
let courseColors: [String : [String : Color]]
let randomCourseColors: [String : [String : Color]]
let existingCourseColors: [String : String]
let days: [DayUiModel]
let bookmark: (() -> Void)?
var body: some View {
Expand All @@ -20,7 +21,8 @@ struct SchedulePreviewGrouperListView: View {
if !(day.events.isEmpty) {
Section(header: DayHeaderSectionView(day: day), content: {
ForEach(day.events, id: \.id) { event in
SchedulePreviewCardView(previewColor: courseColors[event.course.id]!.values.first!, event: event, isLast: event == day.events.last)
SchedulePreviewCardView(
previewColor: existingCourseColors[event.course.id] != nil ? hexStringToUIColor(hex: existingCourseColors[event.course.id]!) : randomCourseColors[event.course.id]!.values.first!, event: event, isLast: event == day.events.last)
}
})
.padding(.top, 35)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,10 @@ import SwiftUI

struct SchedulePreviewView: View {
@EnvironmentObject var parentViewModel: SearchParentView.SearchViewModel
@StateObject var viewModel: SchedulePreviewViewModel = SchedulePreviewViewModel()
var body: some View {
if (parentViewModel.previewDelegateStatus == .loaded) {
let courseColors = parentViewModel.scheduleForPreview!.assignCoursesColors();
SchedulePreviewGrouperListView(toggled: parentViewModel.schedulePreviewIsSaved, courseColors: courseColors, days: parentViewModel.scheduleForPreview!.days.toUiModel()) {
let courseColors = parentViewModel.scheduleForPreview!.assignRandomCoursesColors();
SchedulePreviewListView(toggled: parentViewModel.schedulePreviewIsSaved, randomCourseColors: courseColors, existingCourseColors: parentViewModel.courseColors, days: parentViewModel.scheduleListOfDays!) {
parentViewModel.onBookmark(courseColors: courseColors)
}
}
Expand Down
35 changes: 16 additions & 19 deletions tumble-ios/Core/Views/Search/SearchParentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,22 @@ struct SearchParentView: View {
ZStack {
VStack (spacing: 0) {
Spacer()
self.onBuild()
switch viewModel.status {
case .initial:
SearchInitialView()
case .loading:
Spacer()
CustomProgressView()
Spacer()
case .loaded:
SearchResultsView(searchText: viewModel.searchResultText, numberOfSearchResults: viewModel.numberOfSearchResults, searchResults: viewModel.searchResults, onLoadSchedule: { programme in
viewModel.onLoadSchedule(programme: programme)
})
case .error:
SearchErrorView()
case .empty:
InfoView(title: "Schedule is empty", image: nil)
}
SearchBar()
.environmentObject(viewModel)
.onSubmit {
Expand All @@ -30,22 +45,4 @@ struct SearchParentView: View {
.environmentObject(viewModel)
}
}

private func onBuild() -> AnyView {
switch viewModel.status {
case .initial:
return AnyView(SearchInitialView())
case .loading:
return AnyView(
CustomProgressView())
case .loaded:
return AnyView(SearchResultsView(searchText: viewModel.searchResultText, numberOfSearchResults: viewModel.numberOfSearchResults, searchResults: viewModel.searchResults, onLoadSchedule: { programme in
viewModel.onLoadSchedule(programme: programme)
}))
case .error:
return AnyView(SearchErrorView())
case .empty:
return AnyView(Text("Schedule is empty"))
}
}
}

0 comments on commit 6373aa6

Please sign in to comment.