Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
57b5025
Adding a quick link to the RaceSync iOS project on github.com
dzenbot Jan 7, 2026
24dbbd1
Disabled pilot management of a race, from outside a race detail view,…
dzenbot Jan 9, 2026
f0daa97
Hiding the option to finalize a race, for good this time
dzenbot Jan 9, 2026
ee50e85
The cell used for displaying the total paid, shouldn't change backgro…
dzenbot Jan 9, 2026
ed59c47
Fixing API credentials not being copied over to the API framework dur…
dzenbot Feb 17, 2026
24a79a8
Polishing display of Series list and optimizing code
dzenbot Feb 18, 2026
d95d3b9
Adding empty data sets to the different lists within Series, their ra…
dzenbot Feb 18, 2026
0e9bd14
Removig the progress indicator for now. Half the time it was misleading.
dzenbot Feb 19, 2026
20a61f8
Displaying the html description of a Series and ajusting other UI ele…
dzenbot Feb 28, 2026
9720982
Fixed not loading profile's chapters
dzenbot Mar 3, 2026
1e7b21c
Implementing the ability to browse past GQ standings (2025-2019)
dzenbot Mar 4, 2026
37d2961
Larger refactor for displaying GQ standings using json data now + Imp…
dzenbot Apr 4, 2026
6c184f2
Tweaking UI changes on standing badge
dzenbot Apr 4, 2026
88b7b52
Simplifying empty data set
dzenbot Apr 4, 2026
52da63e
Handling loading error and displaying the error content on the empty …
dzenbot Apr 4, 2026
8eff0ca
Dealing with some xcode project config
dzenbot Apr 5, 2026
665af49
Fixing RaceSyncAPI framework build script
dzenbot Apr 6, 2026
bec640d
Improving presentation of Series, with new filters and sortings. Disp…
dzenbot Apr 7, 2026
285a71c
Adding participant counts to Series' races
dzenbot Apr 7, 2026
a31cb39
Refactoring how app preferences stored last selected tabs and section…
dzenbot Apr 8, 2026
8261325
Fine tunning the layout of Series' detail view
dzenbot Apr 9, 2026
ca65eb4
Fixing stretchable header effect in Series detail view
dzenbot Apr 10, 2026
750748f
More small UI tweaks to Series detail view
dzenbot Apr 10, 2026
aa939f4
Refactored the series feed storting, to be more useful for the user
dzenbot Apr 10, 2026
936e154
More UI tweaks. Getting there!
dzenbot Apr 10, 2026
d8ca60e
Build bump
dzenbot Apr 10, 2026
35143f7
Improving the result info displayed on Series' leaderboards
dzenbot Apr 11, 2026
421a1bc
Fixing profile header views not displaying the background image to ma…
dzenbot Apr 11, 2026
161d51a
Taping on Series' tab bar's title now displays the Series' id
dzenbot Apr 11, 2026
de76929
Refactoring how credentials were being configured and shared in the b…
dzenbot Apr 11, 2026
f4ccf91
Hiding schedule tab (zippyQ) from the race detail view, when not appl…
dzenbot Apr 11, 2026
7237fe7
Fixing race results sometimes not showing up for an ongoing race, due…
dzenbot Apr 11, 2026
18febb2
Updated release notes
dzenbot Apr 11, 2026
b5c1fe0
Build bump
dzenbot Apr 11, 2026
c6e50f8
Decoupled Joinable from API logic, since that is purely for the UI
dzenbot Apr 11, 2026
29d9ebe
Adding Approvable foundation classes
dzenbot Apr 11, 2026
09fbf97
Added the ability to approve, unapprove and remove a Race from/to a S…
dzenbot Apr 12, 2026
09655e8
Fixing button's title disappearing after loading and table view reloads
dzenbot Apr 12, 2026
8bc1315
Release notes update
dzenbot Apr 12, 2026
4db18aa
Build bump
dzenbot Apr 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13,393 changes: 9,033 additions & 4,360 deletions Documentation/UI/logo_series.ai

Large diffs are not rendered by default.

14 changes: 6 additions & 8 deletions Pods/Presentr/Presentr/AlertViewController.xib

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@

---

## 1.9.0

### New Features:
* MultiGP Series now have their own dedicated tab. You can view the Series you are part of, explore new Regional Series qualifiers, and quickly access leaderboards to see current standings.
* Series owners can now also approve, unapprove or remove a Race from the Series they manage.
* Added 2026 GQ standings, along with the ability to browse past GQ standings from 2025 to 2019.

### Fixes and Enhancements:
* The app now opens on the last used tab and segment.
* Various user interface improvements for a smoother experience.
* Fixed race results sometimes not showing up for an ongoing race, due to timezone differences between the race and the app user.
* Fixed an issue where the chapters list would not load in the pilot profile.

---

## 1.8.2

### New Features:
Expand Down
60 changes: 47 additions & 13 deletions RaceSync.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions RaceSync/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// MARK: - UIApplicationDelegate Methods

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

// It is important to call this before anything else
ApplicationControl.initializeRaceSyncAPI()

// Appearance must be called before any UI element is created
Appearance.configureUIAppearance()

// Push notifications config
UNUserNotificationCenter.current().delegate = PushMessagesController.shared

return true
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icn_settings_github.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icn_settings_testflight.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "icn_settings_beta.pdf",
"filename" : "logo_gq2019.pdf",
"idiom" : "universal"
}
],
Expand Down
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq2020.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq2020.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq2021.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq2021.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq2022.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq2022.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq2023.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq2023.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq2024.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq2024.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq2025.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq2025.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq2026.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq2026.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
12 changes: 12 additions & 0 deletions RaceSync/Assets.xcassets/logo_gq_large.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "logo_gq_large.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "placeholder_series_medium.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "placeholder_series_small.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Binary file not shown.
3 changes: 2 additions & 1 deletion RaceSync/Constants/AppWebConstants.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ public class AppWebConstants {
static let livefpv = "https://livefpv.com/"
static let fpvscores = "https://fpvscores.com/"

static let betaSignup = "https://testflight.apple.com/join/BRXIQJLb"
static let testflight = "https://testflight.apple.com/join/BRXIQJLb"
static let github = "https://github.com/MultiGP/racesync-ios"
}

enum AppWeb: Int {
Expand Down
6 changes: 6 additions & 0 deletions RaceSync/Constants/ImageConstants.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ enum PlaceholderImg {
static let profileAvatar = UIImage(named: "placeholder_profile_avatar")
static let profileBkgd = UIImage(named: "placeholder_profile_background")
static let shimmerList = UIImage(named: "placeholder_shimmer_list")

static let seriesSmall = UIImage(named: "placeholder_series_small")
static let seriesMedium = UIImage(named: "placeholder_series_medium")
}

enum ButtonImg {
Expand Down Expand Up @@ -90,11 +93,14 @@ enum SystemImg {
static let gearshapeFill = UIImage(systemName:"gearshape.fill") // iOS 14.0+
static let stack = UIImage(systemName:"rectangle.stack") // iOS 13.0+
static let stackFill = UIImage(systemName:"rectangle.stack.fill") // iOS 13.0+
static let chevronLeft = UIImage(systemName:"chevron.left") // iOS 13.0+
static let chevronRight = UIImage(systemName:"chevron.right") // iOS 13.0+

static let pin_small = UIImage(systemName:"mappin.and.ellipse") // iOS 13.0+
static let globe = UIImage(systemName:"globe") // iOS 13.0+
static let search = UIImage(systemName: "magnifyingglass") // iOS 13.0+
static let badge_cross_small = UIImage(systemName: "xmark.square.fill") // iOS 13.0+
static let trashFill = UIImage(systemName:"trash.fill") // iOS 13.0+

static var flagCheckeredCrossed: UIImage? {
if #available(iOS 18.0, *) {
Expand Down
3 changes: 1 addition & 2 deletions RaceSync/RaceSyncAPI Extensions/Race+UIExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,8 @@ extension Race {
}

var canShowResults: Bool {
if isFinalized { return true } // Assume results should be displayed since the race is finalized already
guard let results = results, results.count > 0 else { return false }
return hasStarted
return true
}

var canShowSchedule: Bool {
Expand Down
63 changes: 44 additions & 19 deletions RaceSync/Tools/ApplicationControl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,52 @@ class ApplicationControl: NSObject {

fileprivate var deeplinkObserver: NSObjectProtocol?


// MARK: - Initialization

override init() {
super.init()

deeplinkObserver = NotificationCenter.default.addObserver(with: .joinedRaceViaDeeplink) { note in
guard let deeplink = note.object as? DeepLink else { return }

DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: { [weak self] in
self?.handle(deeplink)
})
}
}

deinit {
// Add more observers to collections instead of variables?
if let observer = deeplinkObserver {
NotificationCenter.default.removeObserver(observer)
}
}

// MARK: - Public Methods

static func initializeRaceSyncAPI() {

let path = Bundle.main.path(forResource: "credentials", ofType: "plist")
let dict = NSDictionary(contentsOfFile: path ?? "")

guard let key = dict?["API_KEY"] as? String else {
fatalError("API key missing from credentials.plist")
}

#if DEBUG
// Used for auto-completing in the login screen
let email = dict?["EMAIL"] as? String ?? ""
let password = dict?["PASSWORD"] as? String ?? ""
#else
let email = APISessionManager.getSessionEmail() ?? ""
let password = APISessionManager.getSessionPasword() ?? ""
#endif

let credential = APICredential(apiKey: key, email: email, password: password)
APIServices.configure(with: credential)
}

func invalidateSession(forced: Bool = false) {
guard let window = UIApplication.shared.delegate?.window else { return }

Expand Down Expand Up @@ -67,25 +111,6 @@ class ApplicationControl: NSObject {
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url)
}

override init() {
super.init()

deeplinkObserver = NotificationCenter.default.addObserver(with: .joinedRaceViaDeeplink) { note in
guard let deeplink = note.object as? DeepLink else { return }

DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: { [weak self] in
self?.handle(deeplink)
})
}
}

deinit {
// Add more observers to collections instead of variables?
if let observer = deeplinkObserver {
NotificationCenter.default.removeObserver(observer)
}
}
}

// MARK: - Race API Methods
Expand Down
Loading