Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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.

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

---

## 1.9.0

### New Features:
* Implementing the ability to browse past GQ standings (2025-2019)

---

## 1.8.2

### New Features:
Expand Down
42 changes: 31 additions & 11 deletions RaceSync.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

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
5 changes: 5 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,6 +93,8 @@ 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+
Expand Down
10 changes: 1 addition & 9 deletions RaceSync/UI Components/RichEditorView/RichEditorToolbar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,7 @@ class RichEditorToolbar: UIView {
func setupLayout() {
autoresizingMask = .flexibleWidth
backgroundColor = Color.navigationBarColor

let separatorLine = UIView()
separatorLine.translatesAutoresizingMaskIntoConstraints = false
separatorLine.backgroundColor = Color.gray100
addSubview(separatorLine)
separatorLine.snp.makeConstraints {
$0.height.greaterThanOrEqualTo(0.5)
$0.width.equalToSuperview()
}
addSeparatorLine()

addSubview(scrollView)
scrollView.addSubview(toolbar)
Expand Down
9 changes: 1 addition & 8 deletions RaceSync/UI Components/SegmentedTableViewHeaderView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,6 @@ class SegmentedTableViewHeaderView: UITableViewHeaderFooterView {
$0.bottom.equalTo(self.snp.bottom).offset(-Constants.padding)
}

let separatorLine = UIView()
separatorLine.backgroundColor = Color.gray100
addSubview(separatorLine)
separatorLine.snp.makeConstraints {
$0.height.equalTo(0.5)
$0.leading.trailing.equalToSuperview()
$0.bottom.equalTo(self.snp.bottom)
}
addSeparatorLine(.bottom)
}
}
16 changes: 8 additions & 8 deletions RaceSync/UI Components/SliderTableViewHeaderView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ class SliderTableViewHeaderView: UIView {

var isCarouselEnabled: Bool = true

var autoScrollInterval: TimeInterval = 3.0 {
didSet {
guard autoScrollInterval != oldValue, numberOfItems > 0 else { return }
startAutoScroll(interval: autoScrollInterval)
}
}

weak var delegate: SliderTableViewHeaderViewDelegate?

static var height: CGFloat {
Expand Down Expand Up @@ -125,14 +132,7 @@ class SliderTableViewHeaderView: UIView {
make.bottom.equalToSuperview().offset(-Constants.spacing/5)
}

let separatorLine = UIView()
separatorLine.backgroundColor = Color.gray100
addSubview(separatorLine)
separatorLine.snp.makeConstraints {
$0.height.equalTo(0.5)
$0.leading.trailing.equalToSuperview()
$0.bottom.equalTo(self.snp.bottom)
}
addSeparatorLine(.bottom)
}

override var intrinsicContentSize: CGSize {
Expand Down
2 changes: 2 additions & 0 deletions RaceSync/UI Extensions/UISegmentedControl+Extensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,5 @@ extension UISegmentedControl {
return titleForSegment(at: selectedSegmentIndex)
}
}


2 changes: 1 addition & 1 deletion RaceSync/UI Extensions/UITabBarController+Extensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ extension UITabBarController {

// makes sure disabled tabs aren't selected
if let item = vc.tabBarItem, !item.isEnabled {
idx = HomeTabs.default.rawValue
idx = 0
}
}

Expand Down
38 changes: 38 additions & 0 deletions RaceSync/UI Extensions/UIView+Separator.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// UIView+Separator.swift
// RaceSync
//
// Created by Ignacio Romero Zurbuchen on 2026-03-03.
// Copyright © 2026 MultiGP Inc. All rights reserved.
//

import UIKit
import SnapKit

extension UIView {

public static func separatorLine() -> UIView {
let separatorLine = UIView()
separatorLine.backgroundColor = Color.gray100
separatorLine.snp.makeConstraints {
$0.height.equalTo(0.3)
}
return separatorLine
}

public func addSeparatorLine(_ position: UIBarPosition = .top) {

let separatorLine = UIView.separatorLine()
addSubview(separatorLine)

separatorLine.snp.makeConstraints {
$0.width.equalToSuperview()

if position == .top || position == .topAttached {
$0.top.equalTo(snp.top)
} else if position == .bottom {
$0.bottom.equalTo(snp.bottom)
}
}
}
}
3 changes: 0 additions & 3 deletions RaceSync/View Cells/SimpleTableViewCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,6 @@ class SimpleTableViewCell: UITableViewCell {
$0.width.equalTo(Constants.imageHeight * imageRatio)
$0.leading.equalToSuperview().offset(Constants.padding)
$0.centerY.equalToSuperview()

// imageViewWidthConstraint = $0.width.equalTo(Constants.imageHeight * imageRatio).constraint
// imageViewWidthConstraint?.activate()
}

contentView.addSubview(labelStackView)
Expand Down
10 changes: 7 additions & 3 deletions RaceSync/View Controllers/HomeTabBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,16 @@ class HomeTabBarController: UITabBarController {
return RaceFeedViewController(filters, selectedFilter: filters.first!)
}()

fileprivate lazy var seriesVC: SeriesViewController = {
return SeriesViewController()
fileprivate lazy var seriesVC: SeriesFeedViewController = {
return SeriesFeedViewController()
}()

fileprivate lazy var standingsVC: StandingsViewController = {
return StandingsViewController(with: .y2025)
let vc = StandingsViewController(with: .y2026)
vc.title = "Standings"
vc.tabBarItem = UITabBarItem(title: vc.title, image: SystemImg.trophy, selectedImage: SystemImg.trophyFill)
vc.isRootTabBar = true
return vc
}()

fileprivate lazy var titleView: UIView = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ class UserViewController: ProfileViewController, ViewJoinable, RaceEditable {
}

fileprivate func loadChapters(_ forced: Bool = false) {
loadList(forced: forced, isEmpty: raceViewModels.isEmpty,
loadList(forced: forced, isEmpty: chapterViewModels.isEmpty,
segment: .right, fetch: fetchChapters)
}

Expand Down
3 changes: 3 additions & 0 deletions RaceSync/View Controllers/Races/RaceController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,9 @@ class RaceController {

if race.canBeEdited {
alert.addAction(makeEditRaceAction())
}

if race.canManagePilots {
alert.addAction(makeManagePilotsAction())
}

Expand Down
Loading