From 74eac6793f6173c4fc806ed8e44f948a8b32cda8 Mon Sep 17 00:00:00 2001 From: Sophia Liu <91706701+s0phialiu@users.noreply.github.com> Date: Sun, 11 Feb 2024 13:28:25 -0600 Subject: [PATCH] Updated Schedule Page for HackIllinois 2024 (#572) * Updating UI * Updating UI * Updating UI * changes * changes * changes * Merge remote-tracking branch 'origin/dev' into sophia/update-schedule-page * changes * fixed event favorites, added in follow and unfollow endpoints * added functionality to toggle between schedule/shifts * added functionality to toggle between schedule/shifts * cleaning up * started setting up staff shifts * Added some iPad UI changes * Fixed iPad potion sizes * Fix schedule view on iPad, need to fix iPad Pro 12.9 * Trying to add mapImageURL * Fixed error where events didn't show up, added optional handling * Added static maps * editing static map * replace bg pad img * Revert "replace bg pad img" This reverts commit af8858b3b4cf9a22d08f2814a7ddfc550c0fbb36. * changed content bg * improved schedule ui layout for ipad * Added model and service for staff shifts * laid out staff shifts ui view, updated staff hiapi to pass in body --- HIAPI/Models/Event.swift | 4 +- HIAPI/Models/Staff.swift | 11 +- HIAPI/Models/User.swift | 5 + HIAPI/Services/StaffService.swift | 23 ++- HIAPI/Services/UserService.swift | 16 ++ HackIllinois.xcodeproj/project.pbxproj | 12 ++ .../Big Selected Bookmark 1x.png | Bin 0 -> 272 bytes .../Big Selected Bookmark 2x.png | Bin 0 -> 417 bytes .../Big Selected Bookmark 3x.png | Bin 0 -> 599 bytes .../Contents.json | 23 +++ .../Big Unselected Bookmark 1x.png | Bin 0 -> 333 bytes .../Big Unselected Bookmark 2x.png | Bin 0 -> 562 bytes .../Big Unselected Bookmark 3x.png | Bin 0 -> 768 bytes .../Contents.json | 23 +++ .../Big Selected Bookmark 1x.png | Bin 0 -> 272 bytes .../Big Selected Bookmark 2x.png | Bin 0 -> 417 bytes .../Big Selected Bookmark 3x.png | Bin 0 -> 599 bytes .../MenuFavorited.imageset/Contents.json | 12 +- .../MenuFavorited.imageset/MenuFavorited.png | Bin 621 -> 0 bytes .../MenuFavorited@2x.png | Bin 1327 -> 0 bytes .../MenuFavorited@3x.png | Bin 2020 -> 0 bytes .../Big Unselected Bookmark 1x.png | Bin 0 -> 333 bytes .../Big Unselected Bookmark 2x.png | Bin 0 -> 562 bytes .../Big Unselected Bookmark 3x.png | Bin 0 -> 768 bytes .../MenuUnfavorited.imageset/Contents.json | 12 +- .../MenuUnfavorited.png | Bin 849 -> 0 bytes .../MenuUnfavorited@2x.png | Bin 1936 -> 0 bytes .../MenuUnfavorited@3x.png | Bin 2945 -> 0 bytes .../Pink Potion.imageset/Contents.json | 23 +++ .../Pink Potion.imageset/Pink Potion 1x.png | Bin 0 -> 1731 bytes .../Pink Potion.imageset/Pink Potion 2x.png | Bin 0 -> 3232 bytes .../Pink Potion.imageset/Pink Potion 3x.png | Bin 0 -> 4782 bytes .../PinkPotionPad.imageset/Contents.json | 23 +++ .../PinkPotionPad.imageset/PinkPotionPad.png | Bin 0 -> 3374 bytes .../PinkPotionPad2x.png | Bin 0 -> 6629 bytes .../PinkPotionPad3x.png | Bin 0 -> 10117 bytes .../Purple Potion.imageset/Contents.json | 23 +++ .../Purple Potion 1x.png | Bin 0 -> 1774 bytes .../Purple Potion 2x.png | Bin 0 -> 3224 bytes .../Purple Potion 3x.png | Bin 0 -> 4770 bytes .../PurplePotionPad.imageset/Contents.json | 23 +++ .../PurplePotionPad.png | Bin 0 -> 3442 bytes .../PurplePotionPad2x.png | Bin 0 -> 6593 bytes .../PurplePotionPad3x.png | Bin 0 -> 10021 bytes .../Selected Bookmark.imageset/Contents.json | 23 +++ .../Selected Bookmark 1x.png | Bin 0 -> 462 bytes .../Selected Bookmark 2x.png | Bin 0 -> 939 bytes .../Selected Bookmark 3x.png | Bin 0 -> 1428 bytes .../Contents.json | 23 +++ .../Unselected Bookmark 1x.png | Bin 0 -> 316 bytes .../Unselected Bookmark 2x.png | Bin 0 -> 472 bytes .../Unselected Bookmark 3x.png | Bin 0 -> 625 bytes .../DataSources/HIEventDataSource.swift | 10 +- .../Event+CoreDataProperties.swift | 1 + .../HackIllinois.xcdatamodel/contents | 3 +- HackIllinois/UI/HIAppearance.swift | 51 +++++-- .../UI/HIScheduleSegmentedControl.swift | 97 +++++++++--- .../Cells/HIBubbleCell/HIBubbleCell.swift | 2 +- .../Cells/HIBubbleCell/HIEventCell.swift | 34 ++--- .../Cells/HIBubbleCell/HIShiftCell.swift | 141 ++++++++++++++++++ .../UI/TableView/Headers/HIDateHeader.swift | 10 +- .../HIEventDetailViewController.swift | 66 ++++---- .../HIEventListViewController.swift | 8 +- .../HIScheduleViewController.swift | 114 ++++++++++++-- 64 files changed, 687 insertions(+), 129 deletions(-) create mode 100644 HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Big Selected Bookmark 1x.png create mode 100644 HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Big Selected Bookmark 2x.png create mode 100644 HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Big Selected Bookmark 3x.png create mode 100644 HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Big Unselected Bookmark 1x.png create mode 100644 HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Big Unselected Bookmark 2x.png create mode 100644 HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Big Unselected Bookmark 3x.png create mode 100644 HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/MenuFavorited.imageset/Big Selected Bookmark 1x.png create mode 100644 HackIllinois/Assets.xcassets/MenuFavorited.imageset/Big Selected Bookmark 2x.png create mode 100644 HackIllinois/Assets.xcassets/MenuFavorited.imageset/Big Selected Bookmark 3x.png delete mode 100644 HackIllinois/Assets.xcassets/MenuFavorited.imageset/MenuFavorited.png delete mode 100644 HackIllinois/Assets.xcassets/MenuFavorited.imageset/MenuFavorited@2x.png delete mode 100644 HackIllinois/Assets.xcassets/MenuFavorited.imageset/MenuFavorited@3x.png create mode 100644 HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/Big Unselected Bookmark 1x.png create mode 100644 HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/Big Unselected Bookmark 2x.png create mode 100644 HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/Big Unselected Bookmark 3x.png delete mode 100644 HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited.png delete mode 100644 HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited@2x.png delete mode 100644 HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited@3x.png create mode 100644 HackIllinois/Assets.xcassets/Pink Potion.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 1x.png create mode 100644 HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 2x.png create mode 100644 HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 3x.png create mode 100644 HackIllinois/Assets.xcassets/PinkPotionPad.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad.png create mode 100644 HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad2x.png create mode 100644 HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad3x.png create mode 100644 HackIllinois/Assets.xcassets/Purple Potion.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 1x.png create mode 100644 HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 2x.png create mode 100644 HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 3x.png create mode 100644 HackIllinois/Assets.xcassets/PurplePotionPad.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad.png create mode 100644 HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad2x.png create mode 100644 HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad3x.png create mode 100644 HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Selected Bookmark 1x.png create mode 100644 HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Selected Bookmark 2x.png create mode 100644 HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Selected Bookmark 3x.png create mode 100644 HackIllinois/Assets.xcassets/Unselected Bookmark.imageset/Contents.json create mode 100644 HackIllinois/Assets.xcassets/Unselected Bookmark.imageset/Unselected Bookmark 1x.png create mode 100644 HackIllinois/Assets.xcassets/Unselected Bookmark.imageset/Unselected Bookmark 2x.png create mode 100644 HackIllinois/Assets.xcassets/Unselected Bookmark.imageset/Unselected Bookmark 3x.png create mode 100644 HackIllinois/UI/TableView/Cells/HIBubbleCell/HIShiftCell.swift diff --git a/HIAPI/Models/Event.swift b/HIAPI/Models/Event.swift index 8a47a08e..a88bc0c1 100644 --- a/HIAPI/Models/Event.swift +++ b/HIAPI/Models/Event.swift @@ -76,6 +76,7 @@ public struct Event: Codable { case startTime case points case isAsync + case mapImageUrl } public let id: String @@ -85,10 +86,11 @@ public struct Event: Codable { public let info: String public let locations: [Location] public let name: String - public let sponsor: String + public let sponsor: String? public let startTime: Date public let points: Int public let isAsync: Bool + public let mapImageUrl: String? } public struct Location: Codable { diff --git a/HIAPI/Models/Staff.swift b/HIAPI/Models/Staff.swift index 0088e0f9..dfefdc21 100644 --- a/HIAPI/Models/Staff.swift +++ b/HIAPI/Models/Staff.swift @@ -1,10 +1,15 @@ // // Staff.swift -// HIAPI +// HackIllinois // -// Created by Dev Patel on 2/7/24. -// Copyright © 2024 HackIllinois. All rights reserved. +// Created by HackIllinois Team on 2/7/24. +// Copyright © 2017 HackIllinois. All rights reserved. +// This file is part of the Hackillinois iOS App. +// The Hackillinois iOS App is open source software, released under the University of +// Illinois/NCSA Open Source License. You should have received a copy of +// this license in a file with the distribution. // + import Foundation import APIManager diff --git a/HIAPI/Models/User.swift b/HIAPI/Models/User.swift index f3369e5b..626f46fa 100644 --- a/HIAPI/Models/User.swift +++ b/HIAPI/Models/User.swift @@ -182,3 +182,8 @@ public struct DietaryRestrictions: OptionSet, Codable, APIReturnable { public struct Token: Codable, APIReturnable { public let token: String } + +public struct FollowStatus: Codable, APIReturnable { + public let userId: String + public let following: [String] +} diff --git a/HIAPI/Services/StaffService.swift b/HIAPI/Services/StaffService.swift index 84c231d7..d3dbb2ed 100644 --- a/HIAPI/Services/StaffService.swift +++ b/HIAPI/Services/StaffService.swift @@ -1,9 +1,13 @@ // // StaffService.swift -// HIAPI +// HackIllinois // -// Created by Dev Patel on 2/7/24. -// Copyright © 2024 HackIllinois. All rights reserved. +// Created by HackIllinois Team on 2/7/24. +// Copyright © 2017 HackIllinois. All rights reserved. +// This file is part of the Hackillinois iOS App. +// The Hackillinois iOS App is open source software, released under the University of +// Illinois/NCSA Open Source License. You should have received a copy of +// this license in a file with the distribution. // import Foundation @@ -20,15 +24,20 @@ public final class StaffService: BaseService { return APIRequest(service: self, endpoint: "shift/", headers: headers, method: .GET) } - public static func recordStaffAttendance(userToken: String) -> APIRequest { + public static func recordStaffAttendance(userToken: String, eventId: String) -> APIRequest { + var body = HTTPBody() + body["eventId"] = eventId var headers = HTTPHeaders() headers["Authorization"] = userToken - return APIRequest(service: self, endpoint: "attendance/", headers: headers, method: .POST) + return APIRequest(service: self, endpoint: "attendance/", body: body, headers: headers, method: .POST) } - public static func recordUserAttendance(userToken: String) -> APIRequest { + public static func recordUserAttendance(userToken: String, userId: String, eventId: String) -> APIRequest { + var body = HTTPBody() + body["userId"] = userId + body["eventId"] = eventId var headers = HTTPHeaders() headers["Authorization"] = userToken - return APIRequest(service: self, endpoint: "scan-attendee/", headers: headers, method: .PUT) + return APIRequest(service: self, endpoint: "scan-attendee/", body: body, headers: headers, method: .PUT) } } diff --git a/HIAPI/Services/UserService.swift b/HIAPI/Services/UserService.swift index 043f48fa..0773541a 100644 --- a/HIAPI/Services/UserService.swift +++ b/HIAPI/Services/UserService.swift @@ -27,4 +27,20 @@ public final class UserService: BaseService { authorizationHeaders["Authorization"] = userToken return APIRequest(service: self, endpoint: "qr/", headers: authorizationHeaders, method: .GET) } + + public static func favoriteEvent(userToken: String, eventID: String) -> APIRequest { + var authorizationHeaders = HTTPHeaders() + authorizationHeaders["Authorization"] = userToken + var body = HTTPBody() + body["eventId"] = eventID + return APIRequest(service: self, endpoint: "follow/", body: body, headers: authorizationHeaders, method: .PUT) + } + + public static func unfavoriteEvent(userToken: String, eventID: String) -> APIRequest { + var authorizationHeaders = HTTPHeaders() + authorizationHeaders["Authorization"] = userToken + var body = HTTPBody() + body["eventId"] = eventID + return APIRequest(service: self, endpoint: "unfollow/", body: body, headers: authorizationHeaders, method: .PUT) + } } diff --git a/HackIllinois.xcodeproj/project.pbxproj b/HackIllinois.xcodeproj/project.pbxproj index 8a27448b..8e0653f1 100644 --- a/HackIllinois.xcodeproj/project.pbxproj +++ b/HackIllinois.xcodeproj/project.pbxproj @@ -135,6 +135,9 @@ D12B40FF2AC0B0BD001BCB05 /* HIScanAttendanceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D12B40FE2AC0B0BD001BCB05 /* HIScanAttendanceViewController.swift */; }; D134D30F296B3F56006EA589 /* Montserrat-VariableFont_wght.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D134D30E296B3F56006EA589 /* Montserrat-VariableFont_wght.ttf */; }; D14D3AE3295FBDA200EB7995 /* HIBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D14D3AE2295FBDA100EB7995 /* HIBannerViewController.swift */; }; + D187BF582B781A1100AD7356 /* HIShiftCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D187BF572B781A1100AD7356 /* HIShiftCell.swift */; }; + D1BBA5682B70AB940017BD13 /* Staff.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1BBA5672B70AB940017BD13 /* Staff.swift */; }; + D1BBA56A2B70ACCC0017BD13 /* StaffService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1BBA5692B70ACCC0017BD13 /* StaffService.swift */; }; D187BF5A2B78317600AD7356 /* Mentor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D187BF592B78317600AD7356 /* Mentor.swift */; }; D187BF5C2B78318000AD7356 /* MentorService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D187BF5B2B78318000AD7356 /* MentorService.swift */; }; D1BE81172AC8FC680042C078 /* HIAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95E3142A21FAD5B30092C22E /* HIAPI.framework */; }; @@ -345,6 +348,9 @@ D12B40FE2AC0B0BD001BCB05 /* HIScanAttendanceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HIScanAttendanceViewController.swift; sourceTree = ""; }; D134D30E296B3F56006EA589 /* Montserrat-VariableFont_wght.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-VariableFont_wght.ttf"; sourceTree = ""; }; D14D3AE2295FBDA100EB7995 /* HIBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HIBannerViewController.swift; sourceTree = ""; }; + D187BF572B781A1100AD7356 /* HIShiftCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HIShiftCell.swift; sourceTree = ""; }; + D1BBA5672B70AB940017BD13 /* Staff.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Staff.swift; sourceTree = ""; }; + D1BBA5692B70ACCC0017BD13 /* StaffService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StaffService.swift; sourceTree = ""; }; D187BF592B78317600AD7356 /* Mentor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mentor.swift; sourceTree = ""; }; D187BF5B2B78318000AD7356 /* MentorService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentorService.swift; sourceTree = ""; }; D1C5B6572B732E44000E766D /* refresh.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = refresh.json; sourceTree = ""; }; @@ -661,6 +667,7 @@ 95A7D282203D4F54005EAEAF /* HIAnnouncementCell.swift */, 95A7D29F203D60E9005EAEAF /* HIBubbleCell.swift */, 95A7D281203D4F54005EAEAF /* HIEventCell.swift */, + D187BF572B781A1100AD7356 /* HIShiftCell.swift */, 3CF8DB1223B419980035ECAE /* HIProjectCell.swift */, ); path = HIBubbleCell; @@ -711,6 +718,7 @@ D187BF5B2B78318000AD7356 /* MentorService.swift */, AC3B620F25E85D18002386A2 /* ProfileService.swift */, 95E3145C21FAF1740092C22E /* PassService.swift */, + D1BBA5692B70ACCC0017BD13 /* StaffService.swift */, 95E3146321FAF1740092C22E /* RegistrationService.swift */, 95B12044220BEAD700E024BB /* TrackingService.swift */, 95E3145D21FAF1740092C22E /* UserService.swift */, @@ -728,6 +736,7 @@ 95E3146821FAF1740092C22E /* Announcement.swift */, 3521FFA82207C03E00634A63 /* Attendee.swift */, 95E3146521FAF1740092C22E /* Event.swift */, + D1BBA5672B70AB940017BD13 /* Staff.swift */, 2FA73B4F2B58CAC3002658C0 /* Item.swift */, AC3B620D25E85CAD002386A2 /* Profile.swift */, 95E3146621FAF1740092C22E /* SimpleRequest.swift */, @@ -1057,6 +1066,7 @@ E1E4A5DA291C9BF800780BA1 /* HIOnboardingView.swift in Sources */, 95A7D290203D4F54005EAEAF /* HIAnnouncementCell.swift in Sources */, 9515E43722093E1300BCAF92 /* HIEventScannerViewController.swift in Sources */, + D187BF582B781A1100AD7356 /* HIShiftCell.swift in Sources */, 95A7D28F203D4F54005EAEAF /* HIEventCell.swift in Sources */, ACAA717626017EC4000F42B0 /* HICollectionViewFlowLayout.swift in Sources */, DF5B27C5299197E80034A8B9 /* Array.swift in Sources */, @@ -1132,6 +1142,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D1BBA5682B70AB940017BD13 /* Staff.swift in Sources */, 3521FFA92207C03E00634A63 /* Attendee.swift in Sources */, 95E3147521FAF1740092C22E /* User.swift in Sources */, 2FA73B4E2B58CAA0002658C0 /* ShopService.swift in Sources */, @@ -1154,6 +1165,7 @@ 95E3147421FAF1740092C22E /* SimpleRequest.swift in Sources */, D187BF5C2B78318000AD7356 /* MentorService.swift in Sources */, 2FA73B502B58CAC3002658C0 /* Item.swift in Sources */, + D1BBA56A2B70ACCC0017BD13 /* StaffService.swift in Sources */, A5163FED221F283C003C543E /* StatsService.swift in Sources */, 95B12045220BEAD700E024BB /* TrackingService.swift in Sources */, 3C8F62D6238F9825001A5DAF /* TimeService.swift in Sources */, diff --git a/HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Big Selected Bookmark 1x.png b/HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Big Selected Bookmark 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f919e121597baca1c4897f8c4c57e28714ac0a9 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{!&jD$B+ufx6>YSHX8`E##=Q?o7`P;cY$(A z%eo7mxBM1Km#~DtV0&)ev%sE5 zdb-7p+&wsX&eWSS1Dno{iMYrDHUznl| PbTEUbtDnm{r-UW|xiV!; literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Big Selected Bookmark 2x.png b/HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Big Selected Bookmark 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dde5f159500cc57e679b5da24054656d34a35658 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zi4?763JTP3;aKX`wL$-x$ z0ZTc9>;oYu)){;+8cG~EJ=rfDG}K;W;}SUK>-nFXX8A|mbxyk9oA-1%tBZ?ES72hp zluJ$CXQLGQZL_08ugdK-d{aE@ymrwh-phaDE;R36y7S_s(|oBrlB@q$$?a&oFZFcA z!z=0^gq{}E>-=Wfm&GMBm&twkfs2|2B?Oosj^x-ZOtmff+IS{!VmoVXa&BLm(KgMc zZL4`#*eqJ}vZ=nz;rNoX;;&DBd^hXs+lqST<(g5yE^OQ5yZXGh{FD0VYqn`w-zT5D z^TGf7?Tp|`Go_=qHk2jbEtv0Y;(V*@z`o_T_8z>l>poo1K-6l5$8 za(7}_cTVOdki(Mh=D1(BUoOvN1RBf0(0IyE z1&7ND6CB1Cv`5X7&EoJ56 zt!10IU$^$1&9_rcF%fI3rR$!Ay*1wIa54YOp>xV5*-!JoY-Q!FUTpj6#5wh%*IJ+W zlb^iO_<4W(zASE`y^A+8FLdS5b;=NQ>K2GFW_qNruoZlu<<zPthCJlPOD29&i8mrScTx^qrr6r95Brd+u?MuvvHPzsx>=Mg7mI2=P6!`rUW@ zH(mO|aaY6MFVdQ&MBb@ E079JwO8@`> literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Contents.json b/HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Contents.json new file mode 100644 index 00000000..378e85e1 --- /dev/null +++ b/HackIllinois/Assets.xcassets/Big Selected Bookmark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Big Selected Bookmark 1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Big Selected Bookmark 2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Big Selected Bookmark 3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Big Unselected Bookmark 1x.png b/HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Big Unselected Bookmark 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9a5bdd30db72da6151bc6744e06d9c08d771b3 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{v%Hp$B+ufx6>Z-HW>)C@;_$CQBbyE0-+ad zc?+aZsFgC`U7&n|?fGs7LEq@&TqgS$-f>+fGwyCax-c8QY7$up{LTza0n3j^(1|!Dm@An6`#LlM2t#`C)p4)u`|LH2b;U zLKRw`4{U6s-bF8&W_xmCnEeCxnkV~yeqKABMe5(X%Zm;^nl;7gOk&S+RS~O&Yi@pF ZyRWsWQpR@qSD^dmnD?9JcVD@4LO5xpx>J zd>L?XqW6yAvYP7w(k)Nf_Sfe;KUviAP|vIei-&{BVH1lKF)9V&T`DHJa=eXQnS#R4ZUl7mPo8E+;J&LMUn4G{Kml?J~X>SLHj; z+r4DnQr&$?^QSQ@|4HkwoE_@>Ti$NF@wVxLa+f-P&A1^~cz@lF>m0qNI*WH2aNcY8 v{q3~5C$l0)Y2Roo1K-6l5$8 za(7}_cTVOdki(Mh=+hn}&-b1&z5SK@dGYIA)jFN5d}hv3^A4&dFuhaXwdW#`F>{;Q^s-&s z3!X^*;!(1{d8=m2jsAj9Z2RmIe@@(-P|WLoPra)7Gsj%pTb*_6>Urw7l-3v6P29|V zUcM*);qxnxZ|h5MpZi>8|MRQ$`{Xy=zP`A!&F*P&_W6~W-{;sj9QfV7P-fu;6)xXJ zG$S^xxS+Z8Pv$j!v)3!vRnIu3zw&3Q4r(fcxAE%C|)@KTJzpB=Bjrd6+Eatm=@b)zB6nVXKjM*l{*JTF1(1EXNDr-r9W3~IsNC>GwEY@vxFTE*<3XJ^wq)g+1-Cv zGoHrn+V|#8#^mz413R^UUq2nN+4=4J7}fjID#}rlkG0or*y+jV&zf1D`aJfh`SFen z-&Op7jo;Q?EvskJJovfl<`OHxwJSMn4gM>y%vOCLcJ=?l~2ffD<(RTr5)^)=fnmt`BRt=$0uCno)2+>*EB VLFBu#y}$&^;OXk;vd$@?2>^faW)1)V literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Contents.json b/HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Contents.json new file mode 100644 index 00000000..d25f7bcd --- /dev/null +++ b/HackIllinois/Assets.xcassets/Big Unselected Bookmark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Big Unselected Bookmark 1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Big Unselected Bookmark 2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Big Unselected Bookmark 3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Big Selected Bookmark 1x.png b/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Big Selected Bookmark 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f919e121597baca1c4897f8c4c57e28714ac0a9 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{!&jD$B+ufx6>YSHX8`E##=Q?o7`P;cY$(A z%eo7mxBM1Km#~DtV0&)ev%sE5 zdb-7p+&wsX&eWSS1Dno{iMYrDHUznl| PbTEUbtDnm{r-UW|xiV!; literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Big Selected Bookmark 2x.png b/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Big Selected Bookmark 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dde5f159500cc57e679b5da24054656d34a35658 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zi4?763JTP3;aKX`wL$-x$ z0ZTc9>;oYu)){;+8cG~EJ=rfDG}K;W;}SUK>-nFXX8A|mbxyk9oA-1%tBZ?ES72hp zluJ$CXQLGQZL_08ugdK-d{aE@ymrwh-phaDE;R36y7S_s(|oBrlB@q$$?a&oFZFcA z!z=0^gq{}E>-=Wfm&GMBm&twkfs2|2B?Oosj^x-ZOtmff+IS{!VmoVXa&BLm(KgMc zZL4`#*eqJ}vZ=nz;rNoX;;&DBd^hXs+lqST<(g5yE^OQ5yZXGh{FD0VYqn`w-zT5D z^TGf7?Tp|`Go_=qHk2jbEtv0Y;(V*@z`o_T_8z>l>poo1K-6l5$8 za(7}_cTVOdki(Mh=D1(BUoOvN1RBf0(0IyE z1&7ND6CB1Cv`5X7&EoJ56 zt!10IU$^$1&9_rcF%fI3rR$!Ay*1wIa54YOp>xV5*-!JoY-Q!FUTpj6#5wh%*IJ+W zlb^iO_<4W(zASE`y^A+8FLdS5b;=NQ>K2GFW_qNruoZlu<<zPthCJlPOD29&i8mrScTx^qrr6r95Brd+u?MuvvHPzsx>=Mg7mI2=P6!`rUW@ zH(mO|aaY6MFVdQ&MBb@ E079JwO8@`> literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Contents.json b/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Contents.json index a497b50d..933e22e5 100644 --- a/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Contents.json +++ b/HackIllinois/Assets.xcassets/MenuFavorited.imageset/Contents.json @@ -1,26 +1,26 @@ { "images" : [ { + "filename" : "Big Selected Bookmark 1x.png", "idiom" : "universal", - "filename" : "MenuFavorited.png", "scale" : "1x" }, { + "filename" : "Big Selected Bookmark 2x.png", "idiom" : "universal", - "filename" : "MenuFavorited@2x.png", "scale" : "2x" }, { + "filename" : "Big Selected Bookmark 3x.png", "idiom" : "universal", - "filename" : "MenuFavorited@3x.png", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/HackIllinois/Assets.xcassets/MenuFavorited.imageset/MenuFavorited.png b/HackIllinois/Assets.xcassets/MenuFavorited.imageset/MenuFavorited.png deleted file mode 100644 index 5638c7cd12d42417c0a1c6aec8efdbbfc06fa226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmV-z0+RiSP)P000;W1^@s654Bdt00001b5ch_0Itp) z=>Px%CrLy>R7efAmCs8QVI0PvcQgovaFRR-9#;~B4$(P0b*PgN2x6zOpa>M9g9cqA z+e9MS5QIH;5D)feM1R2E6uj+^vM5pK?RlErZDxAMeaC2EdFT6npXd3!@65ZqK*7sm z>taC*f+7Zs4}DEEb~G086@s*|KWkxcYy2+|tv&*l6|S+!ZoGHW#NG^G$KxH?@woQe zj~9fGD6lXq$w=1RjrH<-i5e*1<1VfyA*?6j`Sh%->Iva$jRBs!%$ir<)l1I(C9tRt zwoorch)M>wWPuwrOeam5`)!7N;^V6Y2x>zZt{L3_p46BxSi2eFbe>@hv?Vr2lY(>J z9~eRjC%Er@a0%Bx6EH}?EdkhMdH$>IA61@ml^+;PorD;hW3#I0e@Bxq>v8=W{|VA{RtI6^}xgP$M%BvalQ< z`m;jSJXKu?PfeXC{bdNeHCX)7)>kab)h6(S|C7(CAI|#Py5EBnLJT418x?OtTv#=D z`Za0NeH-}7V!hJ9@e-#N_?cAC>#F1Ri$kmzdhycB=K}l!C0e#GzWCFC00000NkvXX Hu0mjf7uq2{ diff --git a/HackIllinois/Assets.xcassets/MenuFavorited.imageset/MenuFavorited@2x.png b/HackIllinois/Assets.xcassets/MenuFavorited.imageset/MenuFavorited@2x.png deleted file mode 100644 index 66dfde4db9615bdb1c41b61a814ad1f1c9d48070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1327 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 ZyRWsWQpR@qSD^dmnD?9JcVD@4LO5xpx>J zd>L?XqW6yAvYP7w(k)Nf_Sfe;KUviAP|vIei-&{BVH1lKF)9V&T`DHJa=eXQnS#R4ZUl7mPo8E+;J&LMUn4G{Kml?J~X>SLHj; z+r4DnQr&$?^QSQ@|4HkwoE_@>Ti$NF@wVxLa+f-P&A1^~cz@lF>m0qNI*WH2aNcY8 v{q3~5C$l0)Y2Roo1K-6l5$8 za(7}_cTVOdki(Mh=+hn}&-b1&z5SK@dGYIA)jFN5d}hv3^A4&dFuhaXwdW#`F>{;Q^s-&s z3!X^*;!(1{d8=m2jsAj9Z2RmIe@@(-P|WLoPra)7Gsj%pTb*_6>Urw7l-3v6P29|V zUcM*);qxnxZ|h5MpZi>8|MRQ$`{Xy=zP`A!&F*P&_W6~W-{;sj9QfV7P-fu;6)xXJ zG$S^xxS+Z8Pv$j!v)3!vRnIu3zw&3Q4r(fcxAE%C|)@KTJzpB=Bjrd6+Eatm=@b)zB6nVXKjM*l{*JTF1(1EXNDr-r9W3~IsNC>GwEY@vxFTE*<3XJ^wq)g+1-Cv zGoHrn+V|#8#^mz413R^UUq2nN+4=4J7}fjID#}rlkG0or*y+jV&zf1D`aJfh`SFen z-&Op7jo;Q?EvskJJovfl<`OHxwJSMn4gM>y%vOCLcJ=?l~2ffD<(RTr5)^)=fnmt`BRt=$0uCno)2+>*EB VLFBu#y}$&^;OXk;vd$@?2>^faW)1)V literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/Contents.json b/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/Contents.json index 6d4f05f6..aa9a5597 100644 --- a/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/Contents.json +++ b/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/Contents.json @@ -1,26 +1,26 @@ { "images" : [ { + "filename" : "Big Unselected Bookmark 1x.png", "idiom" : "universal", - "filename" : "MenuUnfavorited.png", "scale" : "1x" }, { + "filename" : "Big Unselected Bookmark 2x.png", "idiom" : "universal", - "filename" : "MenuUnfavorited@2x.png", "scale" : "2x" }, { + "filename" : "Big Unselected Bookmark 3x.png", "idiom" : "universal", - "filename" : "MenuUnfavorited@3x.png", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited.png b/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited.png deleted file mode 100644 index ad72a6518f9e7983791162622001d5c3e6c01ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 849 zcmV-X1FrmuP)P000;W1^@s654Bdt00001b5ch_0Itp) z=>Px&3rR#lR7efAR7+?RQ4~FIno3PkIt_JE&|QjJ!G(3*g`gt%M-hZBMA`~cG!F1shKPs$lQD1J@=e< zZ{|Iq&PU^ZQ=KKS>M788(2z%NLTo*Cb%_*^IjN!di2W}jvU>-(B;;c2=_YU|d3-+s z=nm6??l5t%egcVbM3#oSY$(-Bv5eV`4pbiqltbbeX*Vn2Yb(@2v5dEv_1fLk6ya_a zNw1jQV@M(PTLVK9%ev%i$y5O}Qq2WqqYj*?f{v1K2T6_)_|3*TuJtWyBpdUX`$B?Iiqb(G0=FQDQpSZ7)hyH$xfs(uY;yb`al z(~6=Lr*OmV(0XkDkjMLG3UmvQN$yk=pgwc%X?KU=H(nwe&36l!|5WLim9ohW)`@MG zAJ?XZzcem$k~8<1=wV`>$N4}D248tegZKr+cNKvr++3JqDH|J4DI71BM1+6>Rso5m z1AUs|0$?4EAoe^6xnQzL?By|iOt;B`y3>MKABA{s$s{j%WPyoZs*W*i;-5ajx$iF} zYrF&}cvFWl!(#-bbg2_BPZsfE_I8fKi(Eg{ios{zyw}emzK=04P2EVkkq8FQd-LKi zb>dA3km^sRkYC+aZ?4)`oq`j*pMcyL<8pj8?jIu9Ch)ZgEs2<~ zFwwpI2G&z$+7iB6VwFy2F}{H#XyXWG!Wj5LU-9!innPxi=i;?kiDjK5$_P&IQWsdH zh=ua5)D%DK-Fd{{7NH;VW8fvJ{)m-W)+NtBywr_bw_M71T)ZyIBD$*x=LP33_m^B1 z{Wg>>R$^I~JVm>N)~%DseL}A5dMqx9(5~SqvYhHQ8@MSqa2b`SsuWP#6@Ji zQs*)m&sT(Sil{k4hHW(7P#E~Rval?8U1Kzv!{PD0 b&L@SxX}&6HQ`9J~00000NkvXXu0mjf5+aGQ diff --git a/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited@2x.png b/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited@2x.png deleted file mode 100644 index 5320b1537165181efd5ce9e7d07317cf64fb798a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmV;B2XFX^P)Px+N=ZaPRA>e5SzByWMHv2OTPW1twkV*YrG%0YH4%L9fd>UmM7%tBLFIu2MH?i7 zv__FA4`9#-yA_f`8dMSzgkbQ&;4M**2Tgde#t0!$0u-;H-QCjLQo3jS{yjbHoYTFW z-93GClF9t@&wriy|Cu>+fd7lX8Hi(NSgJqj;;BN#v-;yqVtBn&f7HcOsp47lb4Jlw z3k+PaDXV7Jqq#3XS8)^*x*`e#>ojzoRDp{#(I3}@t%$}))iK0+G?2;Zcuok z-=ArPQBBy2(1}+ZC&VOy1y`7P{;4NqMKn69Vi>+a^lfHubCyXktO7l>r@nUg-uSgVwYurw# zD>R?gE;1%GPCuwN&=t{$OpQXHXAsRW418w{ek+Yrm+GM!6~W&M z9HDlpG}G92^$eS~G~-R~z#P%oGsOa4H-#&NI%?4pl`60~CbYt1;!1%7b0m)57r7cY z8^#Ql!)kN-WALEU7h0YxtJD3`pgxSg?Zx{M_BWU~fhmvYC4Q&8 zZo=J~HAJ`!`b;%$Kc}#K#LHv$Q$}bUEx&@FXVX|3Xwgv2V@(-N;s(NngkYiqQyZ(W z_HR>>0}r5M=2Z-zXWw_C(@5?O;009CNk~1T5fUf6Yp~#g!s1a*LuX|a{YOZ6ucNHA zR_&OE)|?+wy=dFc@Cxc$f4m;mOUmV{5JUS?3(2nwb%r63Bu@`(w^WAR8P3vv!a2(% z=&fWt%Nd?WLJ3i+TzOrVlX3ju@es90rCW80@Ch24id~6e z9&(J`Th8Z;-L#C{ke!QvHjct#SW6B{E~fJEPOhGLQ%DJ-4L^i2X_>;h)b;1OBQk1V zzY~Wk=svevb*chWmSl^2H*Ih|JD(B^dp+NjN~6CIWBQ{CE3cnRt|XT41l~-Sk?C8L zQ3PE@;@A)(x4Q8Y*Arc$)9ZxT7Dn|WrW0a?YegKh zizYs3IEwAJ1EWV78FNh8H1?}7rahssDq-RU&gh5?NX*9Y+ou%vxb&Suh8`x^k~(al zQ^A)w+UIcNIl@V7Fr_mmJ`dxzr?cgxE418<%SRYyPtn&yCSDXIkv!Ii?XuGZT12ME z_BtUph%MQi5F@g#h-0A~mN9hg<;pzg;OtiYH5s7?scJP(jUsXv?`pEaOg9F zbL0H?Y+ilZ%@NvX>vCgr^$K#t7G&|t;3_9vz2Z6^8RK;1m0E-&@HnD8M *fnb~r zkB$s19#j#IXqOU(K*^4bm*Ljou{mS6JR>$IQqd8n%2-h-&+3T0$j1?H5z;!;MY6rb zb2d-9vs&HZ$oJd&-hM@({mnfnSNgG{hIoclb4Fcu$XzXtn7lY{V!cs_NyEnnwXF`} zUEaHrZ0$Tt`0kbdmY<9pW_Z8(9j%$#fRVIkef@f*j%L>vDtvmI^BxsrdQ&OcY%wsc1LrtZWL$#&!#> z@CdKaI!K+KSmo2zQ{0c(=|Q2@2ZUE-F!)@#M#o%} zmgdV0U0>eJ!(Oa+H_@$BIMYit)=zMjI?7P-uJjoyZ!(eO--zq=g#35Yp)ZK{yt;UG ziInW6pk!w#^iiqnI^h*ffpSazcnU&WD$(+XIWAv)30Rwnd!7#DnM8GkuQ9bIe=gX! zBl6XzajhqtFeWT*!+|oW&3v>zn~hHJeTd9WLT@4Xtdk>|=oKb4`289!AV)^C#w?vU z%o$lwkJc6WoDhSBMregccr!U+<1F9jNdbjtB0siaw6~|In##^o=n2pO5=EQXuT&;CA>l~F%K5{q*=5LqDyr874RP* Wj&8qTFd#Yr0000g)t diff --git a/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited@3x.png b/HackIllinois/Assets.xcassets/MenuUnfavorited.imageset/MenuUnfavorited@3x.png deleted file mode 100644 index 7050cfcd5d7f2e5ac6e0864d576f774ee3944c22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2945 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 diff --git a/HackIllinois/Assets.xcassets/Pink Potion.imageset/Contents.json b/HackIllinois/Assets.xcassets/Pink Potion.imageset/Contents.json new file mode 100644 index 00000000..b532cf95 --- /dev/null +++ b/HackIllinois/Assets.xcassets/Pink Potion.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Pink Potion 1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Pink Potion 2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Pink Potion 3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 1x.png b/HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7b4949dc50c7b01fdff9fa9bbf46cd087da61b27 GIT binary patch literal 1731 zcmcJQ`8(8$9>>3fajaPjW9mf4SVoN9I5}gigQhH@LWE;!EC*RSc1MUTNi!x4MZ>ja zEv6wyslgb9#1NBhh|?rl#&+E2-sk=Y_jx|A&-?xP{QQ2Nch*ImjkpLz1ONbWtgWTf zkzPK+Q%LY=50Uyijzl=z_HrZuh|2sM5I`!CKYD^9oop~b!w_`&=nx1nKW`2IO?jew zK41V4bjMnnyTpRlO6~EAR`SV*#nWwbZgZnpMM{w3q-p|Jqt({-oaFOM!-|+kQ~aOp zIwCDG9&sD5z?V)}*y&5ll^3afMr+kTHpbkZ4v~g!HuzE|nhN*G zt&`KmP5w!z4)si_ruHxWw-?wtvED$Gv2b}tN}-NqM7X*sUTexdvyH|p;va@)1Aa{! zA;Ap8rJ!0UyHEK%C|!M>*LHPQSHNSwKi#)Cg1VEGhQjcYWRT#P1_`hJ+GCgq1^; zh~$2`mS^!j&uH=L*^hoKtl`c9@62{gLts5CB}CoCfArIZu0&uhwHCQE;T*6hddR@k za_~>5mI+K=cjur}j;L&@SqU!p>{Vi7P2XvoPPbHWlrbXE8wh?fFzCZK>{`c6k|S z$6s<6oNJ6L_nOz&#h>*`0uRyCCsJltm`ZwAxK8w5P{9A4^j`g*5{X|-t7jBV5 zOQ38mFcR$72M2Sy;TF04&2jRNJ@Z6Ve!KI4A^EPi3qNui%jMg9s9VDneD)`g(-4 zpN_C|Sh;tN^wE~GHP&3aGRN8l%H;a06Kk00*G)<6YD_%9QIzNiPrxfYmx>r8)h4!! zi08oxiP>YBi`H|LyXP(ZQQ%BHadN#OST5;+70hwHC1)+(Cm5DM>QVtLEWX!iPOO>? zPb<|fUMI);juzpgr|-+`*V;L&&AgDXjjUsF>qA$GSAfd6l@ER`j(UowHP1#S`(j@p zA;H@l6KgSyr?%Wq(fpjDFQ9+t9;H8A*-WB_T8kKoCS(^Kta@=q-oy27h1(La^V_5F2Hqs)M&hq^Mr) zOY*f@XPh$JU7X#tlnSIwVm-M6EQPi+T#fC zP(|h6{~8;$(&RS;Bif1up|(L2va#lxv8obNurR3vM#<(5y?DRbI$V_ouXJKZc75x5 zuKsbVF%HGw%{XU;V!_9Rf6hE7M*Np_*rO$PCQ0)1_A2~9i*Sz#+n*LoO*X#wgLBJj i{XuVc#@GVsD&x>a8TYc1d^_x@a{#Or&awgHo%#<2cQ17S literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 2x.png b/HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3bec1318c793c9c3698e8c1ad1616e2ace244d41 GIT binary patch literal 3232 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 B@hJcR literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 3x.png b/HackIllinois/Assets.xcassets/Pink Potion.imageset/Pink Potion 3x.png new file mode 100644 index 0000000000000000000000000000000000000000..571b12b59806619155dfb63f03c29c2d0b86af27 GIT binary patch literal 4782 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 S3q1c`0-*Zldeu7c=>Gy{F5X7~ literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/Contents.json b/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/Contents.json new file mode 100644 index 00000000..f3676b66 --- /dev/null +++ b/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "PinkPotionPad.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "PinkPotionPad2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "PinkPotionPad3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad.png b/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad.png new file mode 100644 index 0000000000000000000000000000000000000000..365595b10185083f0c8e44b688cdc6e271adbbf6 GIT binary patch literal 3374 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 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad2x.png b/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6541baac5a3919acd26ba23c0e95cb960b74a4c5 GIT binary patch literal 6629 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 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad3x.png b/HackIllinois/Assets.xcassets/PinkPotionPad.imageset/PinkPotionPad3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a865847b7b04f3c2ffe2701537c0f86c31ba02d GIT binary patch literal 10117 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 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Purple Potion.imageset/Contents.json b/HackIllinois/Assets.xcassets/Purple Potion.imageset/Contents.json new file mode 100644 index 00000000..fcf3608a --- /dev/null +++ b/HackIllinois/Assets.xcassets/Purple Potion.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Purple Potion 1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Purple Potion 2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Purple Potion 3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 1x.png b/HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..0602c42e0b9b535f810110997d6d0127337f7b0b GIT binary patch literal 1774 zcmchYi#rnv1I9PGOm3T!+o76E7g}Y>orcBS(lD0f`jJ~^u62AKrWlh#q0Dm0Wn;32 zxn&lb9dfp>qHV-i9c1purPJhmzJKC8&-=c==Y9WyH{aXKMdhH*K>z@tf^v06?=xWE zfgt()+yOd1-G?I16`KSAC>{F0fqQ%^+>!RmrV1N&I3!+~m&KX6@-os6 zuC*?HAQWO(Su(iXU0eNJbuv)q#<9o>%xwf%M7fy9di2M$jcY$s?}3GAh_Kz$wV(_I z2L0O#dd$%|J$3_zy9_AWT@x()QJgth-(O^mv#_eZF`}tVY)t8bm*)5VOO_kFh?xwpj zzs`{&yWO=c2mRKVZ4L#mFg`t7d-i?lAIG~lIpFDHiOo`PaF{N8wHo|i5Tw!U#dKky z*kP|9Ka1Cv9^pubJ9J}{n{a^yNw$FoNBQEX%pY%U-z!Z)E2a!rOoG`*U5(3YD7=h4 zKR*1(=OZiEWutDnftAb9n_g#zgU-2;1`WCjO-;a{pSS_%A@gVc)ah zgk${Z{F^rB$CE!hPS(yFZ`~bpBM~<{MULyt>C8DP0*M8R5hD>D&;r zN-aJq2Jmp6kX1vU8_Khr|8-;Ol~IK)ac8kUEQ)?q-80IGA9Avmyv4GFo2N9m=lxk= z{T7O?RREMz?qeQHS4)SwBVcJY5f$Oa*|%u$aWyiPO#ZVc3-h5*uOrD^H`H zM2!>cO;!3CP|6qzGx{#jqU@FX$Lub+Z7QE5g2A{;=(F=Wn(tKA;JOgHm$4r4Qo8k*f{_4;t+3FOzcSY7~#> zZfY@{hiZmApqyXM!s`N~qtvn1A}_(PhUDJ+@ggVL%2S&vsoB5J92{Ap>To<(niI&P zirnd5I0@3{PP=^W5GiSDzK-_Fv`Vk7X-n=J{fW%w)fM4++x3C%jM*KiWe&mWpAZY| zmo*)vv8WWV6a8XHz1@^^;}S>1az_MeZ>L9Thp?1p_QDf*(nMkt5G(o>Ius9C!WSr% zjdfAJOWr7Ns-e4c)usM~d2%vkvr6n54#|{4p9D{_ki(2BVRA zCCvs_cLSY(t9i$RNy~|&x~fsKjzlN+&iCZ{6P66qEYqt&_19zWgAPeb9_KUtHZY4Z zr$n|B?1*}n=a^C7Te*}bQQjLS^7m^n2eP1GumPcCW>RgMFDROrtE`zQqruPAF4B_X zX7$CNT=`^*m$Y&$Ie0j#__%o};Ys4&^q=18{%z=#c(3#J$VUV%Nh)Cdz)KsCcYKdC zBK#fPyDx9zp2-e6H_xFPPeRIX5_IcC`cM+m$Di55eYU>)4OLdRjonjtDdS4r7VzTt P?+JiHdO5c`h7kS-YkW|1 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 2x.png b/HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..07a52d8cedcac64dec0603db7403d34e24f0a7d0 GIT binary patch literal 3224 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 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 3x.png b/HackIllinois/Assets.xcassets/Purple Potion.imageset/Purple Potion 3x.png new file mode 100644 index 0000000000000000000000000000000000000000..495ef0e5607c86d9b92fb1bbebe2e66bc304aea2 GIT binary patch literal 4770 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 Utj`&9`K1KtY8q&u)SgBD2aF)>@c;k- literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/Contents.json b/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/Contents.json new file mode 100644 index 00000000..b5a1d817 --- /dev/null +++ b/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "PurplePotionPad.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "PurplePotionPad2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "PurplePotionPad3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad.png b/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad.png new file mode 100644 index 0000000000000000000000000000000000000000..24df0b39f81b7afd56f46054b4ce2e70551cc292 GIT binary patch literal 3442 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 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad2x.png b/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8c34e82c91beaefb77de5eeb6596fcb7c26f6418 GIT binary patch literal 6593 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 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad3x.png b/HackIllinois/Assets.xcassets/PurplePotionPad.imageset/PurplePotionPad3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6696ff7a8547db24448d643f4ffab73a85977361 GIT binary patch literal 10021 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 literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Selected Bookmark 2x.png b/HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Selected Bookmark 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8aa42f7cab955a08a88031387cd104d986c5bd GIT binary patch literal 939 zcmV;c162HpP)lO`px88YIP0(YN=9!!W3@%g83 zKMs=4calyl_S`y5&8X7Y+PlUJ;nykgDd6>BE1 zSTlLWn#n8HOkS~O@`^Q+SFD-5V$I|gYbLK`YDNJbCs;k)0aOM}N-wTBG{)Vpz-8rh8g z3J`v&T!yXP_L-kFZ|~@5i!QC#Paf4Br5ZGT2_tfEGefpgYE1rEwqQy#S6j&uqGh(s z*od~^wpXoQPPs447KBXLs#Vvx5KIu>f?%;&EJ?rw?{Gj2LYaU8*SmD%&+gJweb0sp z_dmn+^>z2~@Q@Fp&iwqm8w5eY_kDd|sZ?|xBC3mvi>QE{o123|p&&b*P6z`GEiEmf zloEvy4$VQD@0_2Xv!)x>CT-|;yJ}`;hP5T@E-o(0lamu3vu>!A3Zwe*g%3M5tL5co zPLL}rDu2Q-)GNHbSZQ=+k)ot@=HiRtNS{f>+X zY82=9$XF0*v!2n`d6c6~)a!NKI5Kg|$S^ZxT*2z>H9uFagD zo(f(lzo(*6j-;R#pfB}+gPw7eIA~!-DpuIo*lkZ@BLifg0M))6&@n`h#NJ~xMVO=>vFB*(kyL}SzSxPjEC!r0<4 z(vH{ai};rw$X^!_3Gg4Cx~h!$=QMkdHr-wW%i@3&a$mi1)UsGc N002ovPDHLkV1nmTuucE~ literal 0 HcmV?d00001 diff --git a/HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Selected Bookmark 3x.png b/HackIllinois/Assets.xcassets/Selected Bookmark.imageset/Selected Bookmark 3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c607269baaf6750a5d835e8ffa79efcf987c89a GIT binary patch literal 1428 zcmcJP`9Bj39LMJxo94CeZ6QpgToZHTksPxm=@27VH0S0;$8<27tDZ4Q zMug#&qa33!MjM`Zm?L@iyq>?|dA&Zz>+}Bg`+9vd&!HV5U^OrR0Dw3y#0Z_h?Po8d={y5~sd%Rdfwk2`4 z**;F}SaPS1T39>N1`2CeK*DmStTwJt{RZ{KXe(XEEmjLOr=l6W)}8N;z#d?bN;+03 z5o?5=we$X2+KYYdM-^>A-l=$NM~ET`>yRrBAc*R=bxmUx+n#*P@bnC#`fAw zZ1i|GiB8g5x+d2@PvDP9M<`9-Z*!0dh3bo|GZlX~e*Rg| zvH=Z+71SNH8GV7U{FW)#wPr2crm9H%n|3>-QG;ysg5Gv>JM$D4`>4*;-G>A>Vktrw zK+@}kv_$6rh|Lq2u#AukqjXPZfm23dsZQ`f2KZ!&<2CwtwyNrr?N`%Z|m07yLxaIZO zeAZ!g$g`^*O2xbikV_+fC^$}iE>7djjJ;f6?cvDg1tZtZG^LmjDMrk6KpC^ptZxG# zRuTzVGmXJngBoL`(^n=_$Y$B|J6g+^-w?Yc2VaW3GfvzN+XMV}c9n(3GiNgcyYvy| zGQSQT+9w!R`ixCX7*@>-Z4Z*SIb-X0c$8tQwK zlhhI3MngnM53;9|VtZWe0czdvYh!(VeNFC`>o|ut#Ma+$^66k-NK1?!=lGoSu)Hl@ zUrYTuwrA6pfo8*9@3~7RB_+-D_djTAZB-5r4-dxU&+qw1%3&~=Z|hGZBtL-loH2oc zyc(()qpG_4=&dN-Ke^QMt)D+JhGq?4czRVox;HnESE}n|>0~-?Bw^PUD@U)4S>qBD z$(ZxoqD3y;54sWV+<<_9B5LbX>f~qnRX+ctXBEsHjSh~hB^3T4zq`A81T|W;y?W+ZgkeWvgWrX}0f7E|lZcK!K`T6Z^4ipUQfI zu$8Jr4t-M0mui`>##$}u{}hl#tGUMHYhKRPZOl=M7O1xDKan%+zSJl%CUMygj>T5} zE;__;REU4*VJRPNKU}O<79qQN z$q`{I&Cn*Rhx2}~CnbnYizAdUG6MWeW@aQ`jUMY)r>SkElFBNhSes19kVWHhmyu%O zKs&Eztp|g=%4iaka0T$(cR&NY)K8QSy~^e|J+PU**V6s)IrTY7K0zXl<4f-!i6`cM zFEuSWFAHJ7Cw_x1yPk}_BY~J%G3klau`;;o>QR+d;i9yjqe^&)`J%AIvjIj0`zlU_ zP8W>h>$r25zTyH(G2;unH#$jWTe|5#_B!qrpzmr{&^#73kpl%3Ev^ah@snbhz&4)q m?(ZS z9OUlAu+mOY~*c;In zwm=~;-;?vD!&`;2gmv>SIlei-#&Wr_+U#VXbYQ2WVwH&fo7D3AXXJl4U!GU8P?JF+ z(7lD_i1)0UXO)e0YSgaoaK3%G^OeBmyvf|xQsRUAfyXoufxLbnE=(A6ge&OlF6| zP=15@1Q*43SA-Ana+psLW{9>I%1g*Uz<8vETO!@pdw%|`43Ff6AqslWw$H9RlYg&1 z?PHt5ojIBHf|nZ_X7QMA<6%w|`TVycEiEP0(`RyQhtZ76GtWa_b55-s(O&xp79)@7rs(O12uAKa_qlyUoK(4j3-VZ2KFL~p)2 zH|L@E)8;L&UVSv^niMy0hEcDU(1)YtIX{@cF(p4%^II?U^N^{;%8ES+J#QQ)?qa^p z(iI$%k#hELWe#GEYi{^Yb@U|?Mcy%Y#jQZW_8xRx>d_0d-~#+x_f-06Q{KvIGN|- zx&QmG9!u;0l{5Vwc%}w!ud=r8Sh~a_ip!4QQ2mor=bBF;T-$}`M@$jZ?F$b(eW<-= z>dPxfo#IMtcAs@iP5!uMh4gyIxQ|ErkG=Me+xIab$xug{`_>gFgOAs>9c7ge z%cbYdyQ(G#eXKZWQEty8naT2#!z-g>*(SNgH+A=U-n;aOIh;-ZnS_)xd+F}5{J@)g zC-+1zj{m>zSn9w1Z( = [.second, .nanosecond] diff --git a/HackIllinois/Models/CoreDataModels/HackIllinois.xcdatamodeld/HackIllinois.xcdatamodel/contents b/HackIllinois/Models/CoreDataModels/HackIllinois.xcdatamodeld/HackIllinois.xcdatamodel/contents index 90825541..dfd14fbf 100644 --- a/HackIllinois/Models/CoreDataModels/HackIllinois.xcdatamodeld/HackIllinois.xcdatamodel/contents +++ b/HackIllinois/Models/CoreDataModels/HackIllinois.xcdatamodeld/HackIllinois.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -18,6 +18,7 @@ + diff --git a/HackIllinois/UI/HIAppearance.swift b/HackIllinois/UI/HIAppearance.swift index 907860fb..6bf6f14f 100644 --- a/HackIllinois/UI/HIAppearance.swift +++ b/HackIllinois/UI/HIAppearance.swift @@ -16,6 +16,8 @@ struct HIAppearance: Equatable { let neonCountdownText: UIColor let titleText: UIColor let whiteText: UIColor + let darkGreenText: UIColor + let lightYellowText: UIColor let baseText: UIColor let accent: UIColor let viewTitleGreen: UIColor @@ -41,12 +43,13 @@ struct HIAppearance: Equatable { let whiteTagFont: UIColor let interestBackground: UIColor let buttonGreen: UIColor - let buttonPink: UIColor + let buttonBrown: UIColor let buttonLightPink: UIColor - let buttonBlue: UIColor + let buttonPurple: UIColor let buttonDarkBlue: UIColor let buttonMagenta: UIColor let buttonDarkBlueGreen: UIColor + let buttonDarkGreen: UIColor let favoriteStarBackground: UIColor let segmentedBackground: UIColor let buttonYellow: UIColor @@ -81,7 +84,9 @@ struct HIAppearance: Equatable { let countdownTextColor: UIColor let countdownBackground: UIColor let bannerBackground: UIColor - + let proBackground: UIColor + let eventCard: UIColor + let clear: UIColor = .clear let black: UIColor = .black let white: UIColor = .white @@ -117,7 +122,9 @@ struct HIAppearance: Equatable { private static let lightGreen = #colorLiteral(red: 0.7019607843, green: 0.8392156863, blue: 0.537254902, alpha: 1) private static let lightBlue = #colorLiteral(red: 0.7176470588, green: 0.8392156863, blue: 0.8392156863, alpha: 1) private static let teal = #colorLiteral(red: 0.537254902, green: 0.7450980392, blue: 0.6666666667, alpha: 1) + private static let medTeal = #colorLiteral(red: 0.4274509804, green: 0.6117647059, blue: 0.6274509804, alpha: 1) private static let darkGreen = #colorLiteral(red: 0.05098039216, green: 0.2470588235, blue: 0.2549019608, alpha: 1) + private static let darkestGreen = #colorLiteral(red: 0.02745098039, green: 0.1725490196, blue: 0.1803921569, alpha: 1) private static let lightBrown = #colorLiteral(red: 0.5882352941, green: 0.2980392157, blue: 0.1019607843, alpha: 1) private static let brown = #colorLiteral(red: 0.4, green: 0.168627451, blue: 0.07450980392, alpha: 1) private static let darkBrown = #colorLiteral(red: 0.337254902, green: 0.1411764706, blue: 0.06666666667, alpha: 1) @@ -130,6 +137,7 @@ struct HIAppearance: Equatable { private static let transparent = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0) private static let white = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) private static let black = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) + private static let offWhite = #colorLiteral(red: 1, green: 0.9725490196, blue: 0.9607843137, alpha: 1) private static let transparent2 = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0) private static var statusBarWhite: UIStatusBarStyle { @@ -147,12 +155,14 @@ struct HIAppearance: Equatable { neonCountdownText: lightYellow, titleText: lightBlack, whiteText: white, + darkGreenText: darkestGreen, + lightYellowText: bLightYellow, baseText: lightBlack, - accent: orange, + accent: white, viewTitleGreen: darkGreen, action: tan, baseBackground: white, - contentBackground: lightBlue, + contentBackground: offWhite, overlay: #colorLiteral(red: 0.05882352941, green: 0.07058823529, blue: 0.1803921569, alpha: 0.33), frostedTint: #colorLiteral(red: 0, green: 0.3411764706, blue: 0.462745098, alpha: 0.6), codePopupTab: white, @@ -172,12 +182,13 @@ struct HIAppearance: Equatable { whiteTagFont: white, interestBackground: orange, buttonGreen: yellowGreen, - buttonPink: pink, + buttonBrown: lightBrown, buttonLightPink: other, - buttonBlue: blue, + buttonPurple: indigo, buttonDarkBlue: darkBlue, buttonMagenta: magenta, buttonDarkBlueGreen: darkBlueGreeen, + buttonDarkGreen: darkGreen, favoriteStarBackground: yellowWhite, segmentedBackground: white, buttonYellow: bLightYellow, @@ -207,19 +218,23 @@ struct HIAppearance: Equatable { profileBaseText: profileBaseText, countdownTextColor: brown, countdownBackground: orange, - bannerBackground: lightYellow + bannerBackground: lightYellow, + proBackground: medTeal, + eventCard: offWhite ) fileprivate static let night = HIAppearance( neonCountdownText: lightYellow, titleText: lightBlack, whiteText: white, + darkGreenText: darkestGreen, + lightYellowText: bLightYellow, baseText: lightBlack, - accent: orange, + accent: white, viewTitleGreen: darkGreen, action: tan, baseBackground: white, - contentBackground: lightBlue, + contentBackground: offWhite, overlay: #colorLiteral(red: 0.05882352941, green: 0.07058823529, blue: 0.1803921569, alpha: 0.33), frostedTint: #colorLiteral(red: 0, green: 0.3411764706, blue: 0.462745098, alpha: 0.6), codePopupTab: white, @@ -239,12 +254,13 @@ struct HIAppearance: Equatable { whiteTagFont: white, interestBackground: orange, buttonGreen: yellowGreen, - buttonPink: pink, + buttonBrown: lightBrown, buttonLightPink: other, - buttonBlue: blue, + buttonPurple: indigo, buttonDarkBlue: darkBlue, buttonMagenta: magenta, buttonDarkBlueGreen: darkBlueGreeen, + buttonDarkGreen: darkGreen, favoriteStarBackground: yellowWhite, segmentedBackground: white, buttonYellow: bLightYellow, @@ -274,7 +290,9 @@ struct HIAppearance: Equatable { profileBaseText: profileBaseText, countdownTextColor: brown, countdownBackground: orange, - bannerBackground: lightYellow + bannerBackground: lightYellow, + proBackground: medTeal, + eventCard: offWhite ) fileprivate static var current = day @@ -287,19 +305,20 @@ struct HIAppearance: Equatable { enum Font { // Fonts ending with "Pad" correspond to the iPad font sizes - // Glyph font corresponds to the time texts that separate the event cells on the schedule page and the "Memories Made" (2023 app) text + // Glyph font corresponds to the time texts that separate the event cells on the schedule page (2023) and the "Memories Made" (2023 app) text static let glyph = UIFont(name: "MontserratRoman-Bold", size: UIDevice.current.userInterfaceIdiom == .pad ? 24 : 16) // Home segemented control fonts static let homeSegmentedTitle = UIFont(name: "MontserratRoman-Bold", size: UIDevice.current.userInterfaceIdiom == .pad ? 40 : 24) // Schedule page segmented control fonts - static let segmentedNumberText = UIFont(name: "MontserratRoman-SemiBold", size: UIDevice.current.userInterfaceIdiom == .pad ? 36 : 18) // Dates + static let segmentedNumberText = UIFont(name: "MontserratRoman-SemiBold", size: UIDevice.current.userInterfaceIdiom == .pad ? 64 : 32) // Dates static let scheduleSegmentedPad = UIFont(name: "MontserratRoman-SemiBold", size: 32) static let segmentedTitle = UIFont(name: "MontserratRoman-Bold", size: 16) // More Schedule page fonts static let timeIndicator = UIFont(name: "MontserratRoman-Bold", size: 32) static let happeningEventTitle = UIFont(name: "MontserratRoman-Bold", size: 25) + static let dateHeader = UIFont(name: "MontserratRoman-Bold", size: UIDevice.current.userInterfaceIdiom == .pad ? 24 : 14) // Date header event cell separators 2024 // Main header title for each page (Profile, Schedule, etc) static let viewTitle = UIFont(name: "MontserratRoman-Bold", size: UIDevice.current.userInterfaceIdiom == .pad ? 48 : 24) @@ -371,7 +390,7 @@ struct HIAppearance: Equatable { static let leaderboardRankPad = UIFont(name: "MontserratRoman-Bold", size: 48) // Misc - static let sectionHeader = UIFont(name: "MontserratRoman-Bold", size: 13) + static let sectionHeader = UIFont(name: "MontserratRoman-Bold", size: 12) static let button = UIFont(name: "MontserratRoman-Regular", size: 15) static let welcomeTitle = UIFont(name: "MontserratRoman-Bold", size: UIDevice.current.userInterfaceIdiom == .pad ? 40: 24) diff --git a/HackIllinois/UI/HIScheduleSegmentedControl.swift b/HackIllinois/UI/HIScheduleSegmentedControl.swift index 72a98a7a..49aa994f 100644 --- a/HackIllinois/UI/HIScheduleSegmentedControl.swift +++ b/HackIllinois/UI/HIScheduleSegmentedControl.swift @@ -30,7 +30,10 @@ class HIScheduleSegmentedControl: HISegmentedControl { private let indicatorCornerRadiusProp: CGFloat = 0.15 private var indicatorView = UIImageView(image: #imageLiteral(resourceName: "Indicator")) - + + private var selectedPotionView: UIImageView? // Keep track of the selected potion + + let padConstant = (UIDevice.current.userInterfaceIdiom == .pad) ? 2.0 : 1 // MARK: - Init init(titles: [String], nums: [Int]? = nil) { self.nums = nums == nil ? [Int]() : nums! @@ -54,12 +57,12 @@ class HIScheduleSegmentedControl: HISegmentedControl { @objc override func refreshForThemeChange() { backgroundColor <- \.clear titleLabels.forEach { - $0.textColor <- \.white + $0.textColor <- \.darkGreenText $0.backgroundColor <- \.clear } numberLabels.forEach { - $0.textColor <- \.white + $0.textColor <- \.darkGreenText $0.backgroundColor <- \.clear } } @@ -93,7 +96,7 @@ class HIScheduleSegmentedControl: HISegmentedControl { // MARK: - View Setup override func setupView() { setupLabels() - addSubview(indicatorView) + // addSubview(indicatorView) } override func setupLabels() { @@ -101,13 +104,32 @@ class HIScheduleSegmentedControl: HISegmentedControl { views.removeAll(keepingCapacity: true) items.indices.forEach { setupViewForItem(at: $0) } constrain(views: views) + + // Highlight the initially selected potion + highlightSelectedPotion() } private func setupViewForItem(at index: Int) { let view = UIView() let titleLabel = UILabel() let numberLabel = UILabel() - + var potionView = UIImageView(image: #imageLiteral(resourceName: "Purple Potion")) + if UIDevice.current.userInterfaceIdiom == .pad { + potionView = UIImageView(image: #imageLiteral(resourceName: "PurplePotionPad")) + } + if index == selectedIndex { + // If it's the selected index, set the potion view color to pink + if UIDevice.current.userInterfaceIdiom == .pad { + potionView.image = #imageLiteral(resourceName: "PinkPotionPad") + } else { + potionView.image = #imageLiteral(resourceName: "Pink Potion") + } + selectedPotionView = potionView + } + // Set up titleLabel and numberLabel + potionView.addSubview(titleLabel) + potionView.addSubview(numberLabel) + view.addSubview(potionView) titleLabel.textAlignment = .center if UIDevice.current.userInterfaceIdiom == .pad { titleLabel.font = titleFontPad @@ -116,23 +138,21 @@ class HIScheduleSegmentedControl: HISegmentedControl { } numberLabel.font = numberFont titleLabel.text = items[index] - titleLabel.textColor <- \.whiteText + titleLabel.textColor <- \.darkGreenText numberLabel.textAlignment = .center numberLabel.text = index < nums.count ? (nums[index] % 10 == nums[index] ? "0" : "") + "\(nums[index])" : "00" - numberLabel.textColor <- \.whiteText - - view.addSubview(titleLabel) - view.addSubview(numberLabel) + numberLabel.textColor <- \.darkGreenText titleLabel.translatesAutoresizingMaskIntoConstraints = false numberLabel.translatesAutoresizingMaskIntoConstraints = false - var segmentedControlConstant = 0.0 + potionView.translatesAutoresizingMaskIntoConstraints = false + var segmentedControlConstant = -10.0 if UIDevice.current.userInterfaceIdiom == .pad { - segmentedControlConstant = 24.0 + segmentedControlConstant = 0 } - titleLabel.constrain(to: view, topInset: 5, trailingInset: 0, leadingInset: 0) - numberLabel.constrain(to: view, trailingInset: 0, bottomInset: -4, leadingInset: 0) - numberLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: segmentedControlConstant).isActive = true + numberLabel.constrain(to: potionView, topInset: 30 * padConstant, trailingInset: 0, leadingInset: 0) + titleLabel.constrain(to: potionView, trailingInset: 0, bottomInset: 0, leadingInset: 0) + titleLabel.topAnchor.constraint(equalTo: numberLabel.bottomAnchor, constant: segmentedControlConstant).isActive = true titleLabel.heightAnchor.constraint(equalTo: numberLabel.heightAnchor).isActive = true view.isUserInteractionEnabled = false @@ -148,10 +168,37 @@ class HIScheduleSegmentedControl: HISegmentedControl { override func didSetSelectedIndex(oldValue: Int) { if oldValue != selectedIndex { + selectedPotionView?.image = #imageLiteral(resourceName: "Purple Potion") + if UIDevice.current.userInterfaceIdiom == .pad { + selectedPotionView?.image = #imageLiteral(resourceName: "PurplePotionPad") + } else { + selectedPotionView?.image = #imageLiteral(resourceName: "Purple Potion") + } + + // Update the color of the newly selected potion + if let potionView = views[selectedIndex].subviews.first as? UIImageView { + if UIDevice.current.userInterfaceIdiom == .pad { + potionView.image = #imageLiteral(resourceName: "PinkPotionPad") + } else { + potionView.image = #imageLiteral(resourceName: "Pink Potion") + } + selectedPotionView = potionView + } displayNewSelectedIndex() sendActions(for: .valueChanged) } } + + private func highlightSelectedPotion() { + if let potionView = views[selectedIndex].subviews.first as? UIImageView { + if UIDevice.current.userInterfaceIdiom == .pad { + selectedPotionView?.image = #imageLiteral(resourceName: "PinkPotionPad") + } else { + potionView.image = #imageLiteral(resourceName: "Pink Potion") + } + selectedPotionView = potionView + } + } override func displayNewSelectedIndex() { let selectedView = views[selectedIndex] @@ -172,15 +219,29 @@ class HIScheduleSegmentedControl: HISegmentedControl { // right if index == items.count - 1 { - view.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -viewPadding).isActive = true + view.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -viewPadding * padConstant).isActive = true } // left if index == 0 { - view.leftAnchor.constraint(equalTo: self.leftAnchor, constant: viewPadding).isActive = true + if UIDevice.current.userInterfaceIdiom == .pad { + if UIScreen.main.bounds.width >= 1024 { + view.leftAnchor.constraint(equalTo: self.leftAnchor, constant: viewPadding + 70).isActive = true + } else if UIScreen.main.bounds.width >= 800 { + view.leftAnchor.constraint(equalTo: self.leftAnchor, constant: viewPadding + 30).isActive = true + } else { + view.leftAnchor.constraint(equalTo: self.leftAnchor, constant: viewPadding + 20).isActive = true + } + } else { + view.leftAnchor.constraint(equalTo: self.leftAnchor, constant: viewPadding).isActive = true + } } else { let prevView = views[index - 1] - view.leftAnchor.constraint(equalTo: prevView.rightAnchor, constant: viewPadding).isActive = true + if UIDevice.current.userInterfaceIdiom == .pad { + view.leftAnchor.constraint(equalTo: prevView.rightAnchor, constant: (viewPadding - 10) * padConstant).isActive = true + } else { + view.leftAnchor.constraint(equalTo: prevView.rightAnchor, constant: viewPadding - 30).isActive = true + } } // width diff --git a/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIBubbleCell.swift b/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIBubbleCell.swift index 31528080..e7329412 100644 --- a/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIBubbleCell.swift +++ b/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIBubbleCell.swift @@ -65,7 +65,7 @@ class HIBubbleCell: UITableViewCell { } func setActive(_ active: Bool) { - let finalColor: HIColor = active ? \.action : \.contentBackground + let finalColor: HIColor = active ? \.action : \.eventCard animator?.stopAnimation(true) animator = UIViewPropertyAnimator(duration: 0.2, curve: .linear) animator?.addAnimations { [weak self] in diff --git a/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIEventCell.swift b/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIEventCell.swift index 8f13271b..f0d26e36 100644 --- a/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIEventCell.swift +++ b/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIEventCell.swift @@ -23,8 +23,8 @@ class HIEventCell: HIBubbleCell { let favoritedButton = HIButton { $0.tintHIColor = \.accent $0.backgroundHIColor = \.clear - $0.activeImage = #imageLiteral(resourceName: "Favorited") - $0.baseImage = #imageLiteral(resourceName: "Unfavorited") + $0.activeImage = #imageLiteral(resourceName: "Selected Bookmark") + $0.baseImage = #imageLiteral(resourceName: "Unselected Bookmark") if UIDevice.current.userInterfaceIdiom == .pad { $0.activeImage = #imageLiteral(resourceName: "FavoritedPad") $0.baseImage = #imageLiteral(resourceName: "UnFavoritedPad") @@ -104,22 +104,15 @@ extension HIEventCell { } static func <- (lhs: HIEventCell, rhs: Event) { lhs.favoritedButton.isActive = rhs.favorite - var contentStackViewHeight: CGFloat = 0.0 - var eventCellSpacing: CGFloat = 8.0 - var stackViewSpacing: CGFloat = 4.7 - var bubbleConstant: CGFloat = 1.0 - var locationImageView = UIImageView(image: #imageLiteral(resourceName: "LocationSign")) - var timeImageView = UIImageView(image: #imageLiteral(resourceName: "Clock")) - var sponsorImageView = UIImageView(image: #imageLiteral(resourceName: "Vector")) - let titleLabel = HILabel(style: .event) - titleLabel.numberOfLines = 2 + var contentStackViewHeight: CGFloat = 0.0; var eventCellSpacing: CGFloat = 8.0 + var stackViewSpacing: CGFloat = 4.7; var bubbleConstant: CGFloat = 1.0 + var locationImageView = UIImageView(image: #imageLiteral(resourceName: "LocationSign")); var timeImageView = UIImageView(image: #imageLiteral(resourceName: "Clock")) + var sponsorImageView = UIImageView(image: #imageLiteral(resourceName: "Vector")); let titleLabel = HILabel(style: .event) + titleLabel.numberOfLines = 2; titleLabel.text = rhs.name lhs.headerView.addArrangedSubview(titleLabel) - titleLabel.text = rhs.name lhs.headerView.setCustomSpacing(9, after: titleLabel) if UIDevice.current.userInterfaceIdiom == .pad { - eventCellSpacing = 12.0 - stackViewSpacing = 15.0 - bubbleConstant = 2.0 + eventCellSpacing = 12.0; stackViewSpacing = 15.0; bubbleConstant = 2.0 locationImageView = UIImageView(image: #imageLiteral(resourceName: "VectorPad")) timeImageView = UIImageView(image: #imageLiteral(resourceName: "TimePad")) sponsorImageView = UIImageView(image: #imageLiteral(resourceName: "SponsorPad")) @@ -142,15 +135,18 @@ extension HIEventCell { timeLabel.text = Formatter.simpleTime.string(from: rhs.startTime) + " - " + Formatter.simpleTime.string(from: rhs.endTime) } let pointsView = HIView { (view) in - view.layer.cornerRadius = 10.5 * bubbleConstant - view.backgroundHIColor = \.buttonPink + view.layer.cornerRadius = 10.5 * bubbleConstant; view.backgroundHIColor = \.buttonBrown view.translatesAutoresizingMaskIntoConstraints = false } let eventTypeView = HIView { (view) in - view.layer.cornerRadius = 10.5 * bubbleConstant - view.backgroundHIColor = \.buttonBlue + view.layer.cornerRadius = 10.5 * bubbleConstant; view.backgroundHIColor = \.buttonPurple view.translatesAutoresizingMaskIntoConstraints = false } + let proTypeView = HIView { (view) in + view.layer.cornerRadius = 10.5 * bubbleConstant; view.backgroundHIColor = \.proBackground + view.translatesAutoresizingMaskIntoConstraints = false + } + let proLabel = HILabel(style: .pointsText); proLabel.text = "Pro" let pointsLabel = HILabel(style: .pointsText) upperContainerView.addSubview(pointsView) pointsView.addSubview(pointsLabel) diff --git a/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIShiftCell.swift b/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIShiftCell.swift new file mode 100644 index 00000000..f886fd66 --- /dev/null +++ b/HackIllinois/UI/TableView/Cells/HIBubbleCell/HIShiftCell.swift @@ -0,0 +1,141 @@ +// +// HIShiftCell.swift +// HackIllinois +// +// Created by HackIllinois Team on 2/10/24. +// Copyright © 2017 HackIllinois. All rights reserved. +// This file is part of the Hackillinois iOS App. +// The Hackillinois iOS App is open source software, released under the University of +// Illinois/NCSA Open Source License. You should have received a copy of +// this license in a file with the distribution. +// + +import Foundation +import UIKit +import HIAPI + + +class HIShiftCell: HIBubbleCell { + // MARK: - Properties + var headerView = UIStackView() + var contentStackView = UIStackView() + var contentStackViewHeight = NSLayoutConstraint() + + var indexPath: IndexPath? + weak var delegate: HIEventCellDelegate? + + // MARK: - Init + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + var headerSpacingConstant: CGFloat = 1.0 + if UIDevice.current.userInterfaceIdiom == .pad { + headerSpacingConstant = 2.0 + } + backgroundColor = UIColor.clear + // add bubble view + contentView.layer.backgroundColor = UIColor.clear.cgColor + bubbleView.addSubview(headerView) + headerView.axis = .vertical + headerView.alignment = .leading + headerView.translatesAutoresizingMaskIntoConstraints = false + headerView.leadingAnchor.constraint(equalTo: bubbleView.leadingAnchor, constant: 17 * headerSpacingConstant).isActive = true + headerView.topAnchor.constraint(equalTo: bubbleView.topAnchor, constant: 16 * headerSpacingConstant).isActive = true + + bubbleView.addSubview(contentStackView) + contentStackView.axis = .vertical + contentStackView.alignment = .leading + contentStackView.translatesAutoresizingMaskIntoConstraints = false + contentStackView.leadingAnchor.constraint(equalTo: headerView.leadingAnchor).isActive = true + contentStackView.trailingAnchor.constraint(equalTo: bubbleView.trailingAnchor, constant: -16).isActive = true + contentStackView.topAnchor.constraint(equalTo: headerView.bottomAnchor, constant: 10 * headerSpacingConstant).isActive = true + contentStackView.bottomAnchor.constraint(greaterThanOrEqualTo: bubbleView.bottomAnchor, constant: -16 * headerSpacingConstant).isActive = true + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) should not be used.") + } +} + +// MARK: - Population +extension HIShiftCell { + static func heightForCell(with event: Event, width: CGFloat) -> CGFloat { + let heightFromEventName = HILabel.heightForView(text: event.name, font: HIAppearance.Font.eventTitle!, width: width - 137) + var heightConstant: CGFloat = 1.6 + if UIDevice.current.userInterfaceIdiom == .pad { + heightConstant = 11.0 + } + let height = heightFromEventName + 160 + if UIDevice.current.userInterfaceIdiom == .pad { + return height + (22 * (heightConstant / 1.45)) + } + return height + 5 + } + static func <- (lhs: HIShiftCell, rhs: Event) { + print(rhs) + var contentStackViewHeight: CGFloat = 0.0; var eventCellSpacing: CGFloat = 8.0 + var stackViewSpacing: CGFloat = 4.7; var bubbleConstant: CGFloat = 1.0 + var locationImageView = UIImageView(image: #imageLiteral(resourceName: "LocationSign")); var timeImageView = UIImageView(image: #imageLiteral(resourceName: "Clock")) + let titleLabel = HILabel(style: .event) + titleLabel.numberOfLines = 2; titleLabel.text = rhs.name + lhs.headerView.addArrangedSubview(titleLabel) + lhs.headerView.setCustomSpacing(9, after: titleLabel) + if UIDevice.current.userInterfaceIdiom == .pad { + eventCellSpacing = 12.0; stackViewSpacing = 15.0; bubbleConstant = 2.0 + locationImageView = UIImageView(image: #imageLiteral(resourceName: "VectorPad")) + timeImageView = UIImageView(image: #imageLiteral(resourceName: "TimePad")) + lhs.headerView.setCustomSpacing(18, after: titleLabel) + } + titleLabel.constrain(width: lhs.contentView.frame.width - 120, height: (HILabel.heightForView(text: rhs.name, font: HIAppearance.Font.eventTitle!, width: lhs.contentView.frame.width - 137)) * bubbleConstant) + let upperContainerView = HIView { + lhs.contentStackView.addArrangedSubview($0) + $0.translatesAutoresizingMaskIntoConstraints = false + } + let middleContainerView = HIView { + lhs.contentStackView.addArrangedSubview($0) + $0.translatesAutoresizingMaskIntoConstraints = false + } + let timeLabel = HILabel(style: .time) + // We can check for async events by checking if the event start and end time is 1970-01-01 00:00:00 +0000 + if rhs.startTime.timeIntervalSince1970 == 0 || rhs.endTime.timeIntervalSince1970 == 0 { + timeLabel.text = HIConstants.ASYNC_EVENT_TIME_TEXT + } else { + timeLabel.text = Formatter.simpleTime.string(from: rhs.startTime) + " - " + Formatter.simpleTime.string(from: rhs.endTime) + } + upperContainerView.addSubview(timeImageView) + upperContainerView.addSubview(timeLabel) + timeLabel.leadingAnchor.constraint(equalTo: timeImageView.trailingAnchor, constant: eventCellSpacing + 1).isActive = true + timeLabel.centerYAnchor.constraint(equalTo: timeImageView.centerYAnchor).isActive = true + let locationLabel = HILabel(style: .newLocation) + if rhs.locations.count > 0 { + locationLabel.text = rhs.locations.map({ ($0 as AnyObject).name }).joined(separator: ", ") + } + middleContainerView.addSubview(locationImageView) + locationImageView.translatesAutoresizingMaskIntoConstraints = false + middleContainerView.addSubview(locationLabel) + locationImageView.centerYAnchor.constraint(equalTo: timeImageView.centerYAnchor, constant: (stackViewSpacing * 2.5) + 14).isActive = true + locationImageView.centerXAnchor.constraint(equalTo: timeImageView.centerXAnchor).isActive = true + locationLabel.leadingAnchor.constraint(equalTo: timeLabel.leadingAnchor).isActive = true + locationLabel.centerYAnchor.constraint(equalTo: locationImageView.centerYAnchor).isActive = true + let descriptionLabel = HILabel(style: .cellDescription) + descriptionLabel.numberOfLines = 2 + descriptionLabel.text = "\(rhs.info)" + lhs.contentStackView.addArrangedSubview(descriptionLabel) + contentStackViewHeight += HILabel.heightForView(text: rhs.name, font: HIAppearance.Font.eventTitle!, width: lhs.contentView.frame.width - 98) + contentStackViewHeight += timeLabel.intrinsicContentSize.height + locationLabel.intrinsicContentSize.height + 13 + 40 + 3 + 40 + } +} + +// MARK: - UITableViewCell +extension HIShiftCell { + override func prepareForReuse() { + super.prepareForReuse() + headerView.subviews.forEach {(view) in + headerView.willRemoveSubview(view) + view.removeFromSuperview() + } + contentStackView.arrangedSubviews.forEach { (view) in + contentStackView.removeArrangedSubview(view) + view.removeFromSuperview() + } + } +} diff --git a/HackIllinois/UI/TableView/Headers/HIDateHeader.swift b/HackIllinois/UI/TableView/Headers/HIDateHeader.swift index 31a8520c..09d8e5c1 100644 --- a/HackIllinois/UI/TableView/Headers/HIDateHeader.swift +++ b/HackIllinois/UI/TableView/Headers/HIDateHeader.swift @@ -20,8 +20,8 @@ class HIDateHeader: UITableViewHeaderFooterView { $0.font = HIAppearance.Font.sectionHeader } let dateView = HIView { (view) in - view.layer.cornerRadius = 10 - view.backgroundHIColor = \.buttonDarkBlue + view.layer.cornerRadius = 15 + view.backgroundHIColor = \.buttonDarkGreen } override init(reuseIdentifier: String?) { @@ -33,10 +33,10 @@ class HIDateHeader: UITableViewHeaderFooterView { dateView.translatesAutoresizingMaskIntoConstraints = false var spaceConstant: CGFloat = 1.0 dateView.addSubview(titleLabel) - dateView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: -8).isActive = true + dateView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: -7).isActive = true dateView.centerXAnchor.constraint(equalTo: safeAreaLayoutGuide.centerXAnchor).isActive = true - dateView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -8).isActive = true - titleLabel.constrain(to: dateView, topInset: 4 * spaceConstant, trailingInset: -16 * spaceConstant, bottomInset: -4 * spaceConstant, leadingInset: 16 * spaceConstant) + dateView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -7).isActive = true + titleLabel.constrain(to: dateView, topInset: 3 * spaceConstant, trailingInset: -16 * spaceConstant, bottomInset: -3 * spaceConstant, leadingInset: 16 * spaceConstant) } required init?(coder aDecoder: NSCoder) { diff --git a/HackIllinois/ViewControllers/HIEventDetailViewController.swift b/HackIllinois/ViewControllers/HIEventDetailViewController.swift index 077dabaa..c9395619 100644 --- a/HackIllinois/ViewControllers/HIEventDetailViewController.swift +++ b/HackIllinois/ViewControllers/HIEventDetailViewController.swift @@ -40,7 +40,7 @@ class HIEventDetailViewController: HIBaseViewController { } else { view.layer.cornerRadius = 8 } - view.backgroundHIColor = \.buttonDarkBlueGreen + view.backgroundHIColor = \.buttonPurple view.translatesAutoresizingMaskIntoConstraints = false } private let eventTypeLabel = HILabel(style: .eventType) @@ -56,7 +56,7 @@ class HIEventDetailViewController: HIBaseViewController { } else { view.layer.cornerRadius = 8 } - view.backgroundHIColor = \.buttonMagenta + view.backgroundHIColor = \.buttonBrown view.translatesAutoresizingMaskIntoConstraints = false } private let pointsLabel = HILabel(style: .eventType) @@ -72,12 +72,9 @@ class HIEventDetailViewController: HIBaseViewController { $0.activeImage = #imageLiteral(resourceName: "MenuClose") $0.baseImage = #imageLiteral(resourceName: "MenuClose") } - private var mapView: GMSMapView! - // private let mapContainerView = HIView { - // $0.translatesAutoresizingMaskIntoConstraints = false - // $0.backgroundHIColor = \.clear - // } - + + private var mapView: UIImageView = UIImageView() + // MARK: Constraints private var descriptionLabelHeight = NSLayoutConstraint() @@ -171,17 +168,7 @@ extension HIEventDetailViewController { // concatenate all location names locationLabel.text = event.locations.map { ($0 as AnyObject).name }.joined(separator: ", ") } - // MARK: GoogleMap Setup - for case let loc as Location in event.locations { - DispatchQueue.main.async { [self] in - let newcamera = GMSCameraPosition.camera(withLatitude: loc.latitude, longitude: loc.longitude, zoom: 18.0) - mapView.camera = newcamera - let marker = GMSMarker() - marker.title = loc.name - marker.position = CLLocationCoordinate2D(latitude: loc.latitude, longitude: loc.longitude) - marker.map = mapView - } - } + setupMap() } override func viewDidAppear(_ animated: Bool) { @@ -247,23 +234,48 @@ extension HIEventDetailViewController { upperContainerView.addSubview(locationImageView) locationImageView.translatesAutoresizingMaskIntoConstraints = false locationImageView.topAnchor.constraint(equalTo: timeImageView.bottomAnchor, constant: 10).isActive = true - locationImageView.leadingAnchor.constraint(equalTo: titleLabel.leadingAnchor).isActive = true + locationImageView.leadingAnchor.constraint(equalTo: titleLabel.leadingAnchor, constant: 2).isActive = true upperContainerView.addSubview(locationLabel) locationLabel.centerYAnchor.constraint(equalTo: locationImageView.centerYAnchor).isActive = true - locationLabel.leadingAnchor.constraint(equalTo: locationImageView.leadingAnchor, constant: 20).isActive = true + locationLabel.leadingAnchor.constraint(equalTo: locationImageView.leadingAnchor, constant: 18).isActive = true } func setupMap() { - let camera = GMSCameraPosition.camera(withLatitude: 40.113882445333154, longitude: -88.22491715718857, zoom: 18.0) -// let mapID = GMSMapID(identifier: "66c463c9a421326e") -// mapView = GMSMapView(frame: .zero, mapID: mapID, camera: camera) - // Map without nightmode - mapView = GMSMapView(frame: .zero, camera: camera) + guard let event = event else { return } + print(event.mapImageUrl) + + // Check if the image URL ends with "svg" and replace it with "png" + var imageUrlString = event.mapImageUrl + if imageUrlString.lowercased().hasSuffix("svg") { + imageUrlString = imageUrlString.replacingOccurrences(of: "svg", with: "png") + } + + if let mapUrl = URL(string: imageUrlString) { + let session = URLSession.shared + self.mapView.image = nil + let task = session.dataTask(with: mapUrl) { (data, response, error) in + if let error = error { + print("Error loading map image: \(error.localizedDescription)") + return + } + if let data = data { + DispatchQueue.main.async { + self.mapView.image = UIImage(data: data) + self.mapView.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) + self.mapView.layer.borderColor = #colorLiteral(red: 0.9254901961, green: 0.8235294118, blue: 0.8235294118, alpha: 1) + self.mapView.layer.borderWidth = 4.0 + } + } + } + task.resume() + } + eventDetailContainer.addSubview(mapView) mapView.translatesAutoresizingMaskIntoConstraints = false mapView.leadingAnchor.constraint(equalTo: eventDetailContainer.leadingAnchor).isActive = true mapView.trailingAnchor.constraint(equalTo: eventDetailContainer.trailingAnchor).isActive = true mapView.topAnchor.constraint(equalTo: locationImageView.bottomAnchor, constant: 15).isActive = true - mapView.constrain(height: 300) + let mapHeight: CGFloat = UIDevice.current.userInterfaceIdiom == .pad ? 450 : 250 + mapView.constrain(height: mapHeight) mapView.layer.cornerRadius = 20 } func setupCloseButton() { diff --git a/HackIllinois/ViewControllers/HIEventListViewController.swift b/HackIllinois/ViewControllers/HIEventListViewController.swift index dfeeacff..7adfb631 100644 --- a/HackIllinois/ViewControllers/HIEventListViewController.swift +++ b/HackIllinois/ViewControllers/HIEventListViewController.swift @@ -74,11 +74,13 @@ extension HIEventListViewController: HIEventCellDelegate { func eventCellDidSelectFavoriteButton(_ eventCell: HIEventCell) { guard let indexPath = eventCell.indexPath, let event = _fetchedResultsController?.object(at: indexPath) as? Event else { return } + + guard let user = HIApplicationStateController.shared.user else { return } - let changeFavoriteStatusRequest: APIRequest = + let changeFavoriteStatusRequest: APIRequest = eventCell.favoritedButton.isActive ? - HIAPI.EventService.unfavoriteBy(id: event.id) : - HIAPI.EventService.favoriteBy(id: event.id) + HIAPI.UserService.unfavoriteEvent(userToken: user.token, eventID: event.id) : + HIAPI.UserService.favoriteEvent(userToken: user.token, eventID: event.id) changeFavoriteStatusRequest .onCompletion { result in diff --git a/HackIllinois/ViewControllers/HIScheduleViewController.swift b/HackIllinois/ViewControllers/HIScheduleViewController.swift index 4c0daa15..cac1a5b0 100644 --- a/HackIllinois/ViewControllers/HIScheduleViewController.swift +++ b/HackIllinois/ViewControllers/HIScheduleViewController.swift @@ -13,9 +13,12 @@ import Foundation import UIKit import CoreData +import HIAPI class HIScheduleViewController: HIEventListViewController { // MARK: - Properties + var staffShifts: [Staff] = [] + lazy var fetchedResultsController: NSFetchedResultsController = { let fetchRequest: NSFetchRequest = Event.fetchRequest() @@ -37,7 +40,7 @@ class HIScheduleViewController: HIEventListViewController { return fetchedResultsController }() - + private var currentTab = 0 private var onlyFavorites = false private let onlyFavoritesPredicate = NSPredicate(format: "favorite == YES" ) @@ -66,10 +69,13 @@ class HIScheduleViewController: HIEventListViewController { return dataStore }() + + // Staff shifts functionality + private var onlyShifts = false @objc dynamic override func setUpBackgroundView() { super.setUpBackgroundView() - backgroundView.image = #imageLiteral(resourceName: "ScheduleBackground") + backgroundView.image = #imageLiteral(resourceName: "PurpleBackground") if UIDevice.current.userInterfaceIdiom == .pad { backgroundView.image = #imageLiteral(resourceName: "BackgroundPad") } @@ -86,10 +92,15 @@ extension HIScheduleViewController { @objc func didSelectFavoritesIcon(_ sender: UIBarButtonItem) { onlyFavorites = !onlyFavorites - sender.image = onlyFavorites ? #imageLiteral(resourceName: "MenuFavorited") : #imageLiteral(resourceName: "MenuUnfavorited") + sender.image = onlyFavorites ? #imageLiteral(resourceName: "Big Selected Bookmark") : #imageLiteral(resourceName: "Big Unselected Bookmark") if UIDevice.current.userInterfaceIdiom == .pad { sender.image = onlyFavorites ? #imageLiteral(resourceName: "FavoritedPad") : #imageLiteral(resourceName: "UnFavoritedPad") } + if sender.image == #imageLiteral(resourceName: "Big Selected Bookmark") { + super.setCustomTitle(customTitle: "SAVED EVENTS") + } else { + super.setCustomTitle(customTitle: "SCHEDULE") + } updatePredicate() animateReload() } @@ -103,6 +114,9 @@ extension HIScheduleViewController { if onlyFavorites { let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [currentTabPredicate, onlyFavoritesPredicate]) return compoundPredicate + } else if onlyShifts { + let noEventsPredicate = NSPredicate(value: false) + return noEventsPredicate } else { return currentTabPredicate } @@ -123,7 +137,7 @@ extension HIScheduleViewController { super.loadView() let items = dataStore.map { $0.displayText } - let segmentedControl = HIScheduleSegmentedControl(titles: items, nums: [24, 25, 26]) + let segmentedControl = HIScheduleSegmentedControl(titles: items, nums: [23, 24, 25]) segmentedControl.addTarget(self, action: #selector(didSelectTab(_:)), for: .valueChanged) segmentedControl.translatesAutoresizingMaskIntoConstraints = false view.addSubview(segmentedControl) @@ -132,9 +146,9 @@ extension HIScheduleViewController { segmentedControlConstant = 40.0 } - segmentedControl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8 + segmentedControlConstant).isActive = true - segmentedControl.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: -34).isActive = true - segmentedControl.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 34).isActive = true + segmentedControl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20 + segmentedControlConstant).isActive = true + segmentedControl.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: -36).isActive = true + segmentedControl.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 40).isActive = true segmentedControl.heightAnchor.constraint(equalToConstant: 66 + segmentedControlConstant).isActive = true // Start the segmented control on the current day @@ -148,11 +162,12 @@ extension HIScheduleViewController { let tableView = HITableView() view.addSubview(tableView) - tableView.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor, constant: 20).isActive = true + let padConstant = (UIDevice.current.userInterfaceIdiom == .pad) ? 4.0 : 1 + tableView.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor, constant: 30 * padConstant).isActive = true tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true - tableView.contentInset = UIEdgeInsets(top: 17, left: 0, bottom: 0, right: 0) + tableView.contentInset = UIEdgeInsets(top: 60, left: 0, bottom: 0, right: 0) tableView.scrollIndicatorInsets = UIEdgeInsets(top: 17, left: 0, bottom: 0, right: 0) self.tableView = tableView @@ -166,10 +181,83 @@ extension HIScheduleViewController { _fetchedResultsController = fetchedResultsController as? NSFetchedResultsController setupRefreshControl() super.viewDidLoad() - super.setCustomTitle(customTitle: "SCHEDULE") + guard let user = HIApplicationStateController.shared.user else { return } + if !user.roles.contains(.STAFF) { + super.setCustomTitle(customTitle: "SCHEDULE") + } else if user.roles.contains(.STAFF) { + setStaffShiftsControl() + } + } +} + +// MARK: - Staff Shifts Control Setup +extension HIScheduleViewController { + @objc func setStaffShiftsControl() { + let customFontSize = UIDevice.current.userInterfaceIdiom == .pad ? 44 : 24 + let customFont = UIFont(name: "MontserratRoman-Bold", size: CGFloat(customFontSize)) + + // Create flexible space items to add space to the left + let flexibleSpaceLeft1 = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + let flexibleSpaceLeft2 = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + let flexibleSpaceLeft3 = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + + let scheduleButton = UIBarButtonItem(title: "SCHEDULE", style: .plain, target: self, action: #selector(scheduleButtonTapped(_:))) + scheduleButton.setTitleTextAttributes([NSAttributedString.Key.font: customFont], for: .normal) + + // Add the flexible space items and custom button to the leftBarButtonItems array + navigationItem.leftBarButtonItems = [flexibleSpaceLeft1, flexibleSpaceLeft2, flexibleSpaceLeft3, scheduleButton] + + // Create flexible space items to add space to the right + let flexibleSpaceRight1 = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + let flexibleSpaceRight2 = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + + // Create custom right bar button item + let customButton = UIBarButtonItem(title: "SHIFTS", style: .plain, target: self, action: #selector(shiftsButtonTapped(_:))) + customButton.setTitleTextAttributes([NSAttributedString.Key.font: customFont], for: .normal) + + // Add the flexible space items and custom button to the rightBarButtonItems array + navigationItem.rightBarButtonItems = [flexibleSpaceRight1, flexibleSpaceRight2, customButton] + + self.navigationItem.leftItemsSupplementBackButton = true + } + + // Actions for left and right buttons + @objc func scheduleButtonTapped(_ sender: UIButton) { + if onlyShifts { + onlyShifts = false + updatePredicate() + animateReload() + } + } + + + @objc func shiftsButtonTapped(_ sender: UIButton) { + if !onlyShifts { + onlyShifts = !onlyShifts + + guard let user = HIApplicationStateController.shared.user else { return } + + HIAPI.StaffService.getStaffShift(userToken: user.token) + .onCompletion { result in + do { + let (staffShifts, _) = try result.get() + self.staffShifts = staffShifts.shifts + print("Staff shifts: ", self.staffShifts) + + DispatchQueue.main.async { + self.updatePredicate() + self.animateReload() + } + } catch { + print("An error has occurred in getting staff shifts \(error)") + } + } + .launch() + } } } + // MARK: - UINavigationItem Setup extension HIScheduleViewController { @objc dynamic override func setupNavigationItem() { @@ -202,7 +290,7 @@ extension HIScheduleViewController { if UIDevice.current.userInterfaceIdiom == .pad { return 60 } else { - return 30 + return 30 // Changes height between event cells } } @@ -224,12 +312,12 @@ extension HIScheduleViewController { section < sections.count, let date = Formatter.coreData.date(from: sections[section].name) { header.titleLabel.text = Formatter.simpleTime.string(from: date) - header.titleLabel.textColor = .white + header.titleLabel.textColor <- \.white header.titleLabel.textAlignment = .center if UIDevice.current.userInterfaceIdiom == .pad { header.titleLabel.font = HIAppearance.Font.timeIndicator } else { - header.titleLabel.font = HIAppearance.Font.glyph + header.titleLabel.font = HIAppearance.Font.dateHeader } }