Skip to content
Merged
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
96 changes: 96 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@

<p align="center"><img src="project/128.png" alt="TorqueNet" height="300px"></p>

# Torquenet App
TorqueNet Auctions is a modern mobile platform that allows users to discover, bid on, and manage vehicle auctions in real time. The app provides a seamless auction experience where users can explore featured cars, view detailed vehicle specifications, track live bids, and place competitive bids directly from their mobile devices.

The platform supports multiple auction states such as upcoming, live, completed, and featured auctions, allowing users to easily browse and filter vehicles based on their auction status. Each vehicle listing includes comprehensive details such as specifications, images, vehicle history, inspection reports, and bid history.

Users can also save vehicles to their wishlist, track auctions they are interested in, and receive updates on bidding activity. Sellers are able to upload vehicles for auction, manage listings, and monitor bidding progress through a structured auction workflow.

Built with SwiftUI and Firebase, the application leverages real-time data synchronization to ensure bids and auction updates are reflected instantly across users.

Key Features
- Browse featured, upcoming, and live car auctions
- View detailed vehicle information and inspection reports
- Real-time bidding system
- Track recent bids and highest bids
- Save vehicles to a wishlist
- Upload vehicles for auction
- Filter and search auctions by status
- Secure user authentication and profile management

## Structural design pattern
The app follows the Model-View-ViewModel (MVVM) pattern, enhanced with principles from Clean Architecture to ensure better separation of concerns and maintainability.
- Models hold the core data and business logic. These are typically lightweight structs or simple classes.
- Views handle the UI layer and display visual elements using SwiftUI.
- ViewModels serve as the bridge between views and models, transforming raw data into view-ready formats. They're implemented as classes to support state observation and reference passing.

By combining MVVM with clean architecture layers (such as Use Cases, Repositories, and Services), the codebase stays modular, testable, and easy to scale as the app grows.

### Auth Screen
<img src="project/SignUp.png" width="250"/> <img src="project/SignIn.png" width="250"/> <img src="project/ResetPassword.png" width="250"/>

### Home Screen
<img src="project/Home.png" width="250"/>

### Auction Screen
<img src="project/Auctions.png" width="250"/> <img src="project/Auction Details.png" width="250"/> <img src="project/Upload Auction.png" width="250"/>

### Wishlist Screen
<img src="project/Wishlist.png" width="250"/>


### Settings Screen
<img src="project/Settings.png" width="250"/>


## 🛠️ Tech Stack

- [**Swift**](https://developer.apple.com/swift/)
Swift is a powerful and intuitive programming language developed by Apple for building applications across iOS, macOS, watchOS, and tvOS. It is designed to be fast, safe, and modern, helping developers write reliable and maintainable code.

- [**SwiftUI**](https://developer.apple.com/xcode/swiftui/)
SwiftUI is Apple’s declarative UI framework used to build user interfaces across all Apple platforms. It enables faster development with live previews, reusable components, and seamless integration with Swift.

- [**Core Data**](https://developer.apple.com/documentation/coredata) Core Data is Apple’s framework for managing the model layer of applications. It provides powerful tools for object graph management and persistence, allowing developers to store and query data efficiently on-device.

- [**Firebase Firestore**](https://firebase.google.com/docs/firestore)
Cloud Firestore is a flexible, scalable NoSQL cloud database from Firebase used to store and sync data in real time. In this app, it manages auctions, bids, vehicles, and user-generated data while keeping information synchronized across devices.

- [**Firebase Authentication**](https://firebase.google.com/docs/auth)
Firebase Authentication provides secure user authentication services including email/password and other authentication methods. It is used in this app to manage user accounts, login, registration, and secure access to auction features.

- [**Clean Architecture**](https://www.geeksforgeeks.org/system-design/complete-guide-to-clean-architecture/)
Clean Architecture organizes the codebase into independent layers such as presentation, domain, and data. This separation improves scalability, maintainability, and testability by enforcing clear boundaries between business logic and UI components.

- [**Navigation in SwiftUI**](https://developer.apple.com/documentation/swiftui/navigationstack)
Navigation in SwiftUI is handled declaratively using `NavigationStack`, `NavigationPath`, and `NavigationLink`. These tools simplify screen transitions and allow the app to manage complex navigation flows in a structured and predictable way.

- [**Core Location**](https://developer.apple.com/documentation/corelocation)
Core Location enables access to device location services. Using `CLLocationManager`, apps can request permission, retrieve location updates, and build features that depend on geographic information.

- [**Swift Concurrency (Async/Await)**](https://developer.apple.com/documentation/swift/concurrency)
Swift’s modern concurrency model using `async/await` simplifies asynchronous programming. It allows network calls, database operations, and background tasks to run efficiently while keeping the code readable and easier to maintain.

- [**App Theming in SwiftUI**](https://developer.apple.com/documentation/swiftui/environmentvalues/colorscheme)
App theming in SwiftUI allows dynamic styling based on system settings or user preferences. The app supports light and dark mode using `@Environment(\.colorScheme)` and a shared theme configuration to maintain a consistent UI across screens.


## Setup Requirements
- IOS device or Simulator
- XCode Editor

## Getting Started
In order to get the app running yourself, you need to:

1. Clone this project
2. Import the project into XCode
3. Get googleService info from firebase setup and add it to the codebase.
4. Connect your IOS device with USB or just start your Simulator
5. After the project has finished setting up it stuffs, click the run button

## Support
- Found this project useful ❤️? Support by clicking the ⭐️ button on the upper right of this page. ✌️
- Notice anything else missing? File an issue
- Feel free to contribute in any way to the project from typos in docs to code review are all welcome.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions TorqueNet/Assets.xcassets/AppIcon.appiconset/Contents.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"images" : [
{
"filename" : "1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
Expand All @@ -12,6 +13,7 @@
"value" : "dark"
}
],
"filename" : "1024 1.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
Expand All @@ -23,6 +25,7 @@
"value" : "tinted"
}
],
"filename" : "1024 2.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ struct AuctionUploadView: View {
placeHolder: "85500",
text: $uploadAuctionViewModel.form.startingBid,
foregroundColor: .theme.surfaceColor,
backgroundColor: .theme.onSurfaceColor.opacity(0.1),
backgroundColor: .theme.onSurfaceColor,
keyboardType: .numberPad,
inputFieldStyle: .outlined,
onTextChange: {text in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,7 @@ struct ManageAuctionUiState {
var auctions: [ManageAuctionItem] = []
var filteredAuctions: [ManageAuctionItem] = []
var selectedFilter: AuctionStatus? = nil

// var isLoading: Bool = false
var errorMessage: String = ""
// var hasError: Bool = false
var showError: Bool = false
var auctionState: FetchState = .good
var showEditSheet: Bool = false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// AuctionNotification.swift
// TorqueNet
//
// Created by MAC on 11/03/2026.
//

import Foundation

struct AuctionNotification: Identifiable {
let id = UUID()
let type: NotificationType
let title: String
let message: String
let timestamp: Date
var isRead: Bool = false
let bidAmount: Double?
let auctionId: String

var timeAgo: String {
let formatter = RelativeDateTimeFormatter()
formatter.unitsStyle = .short
return formatter.localizedString(for: timestamp, relativeTo: Date())
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

import SwiftUI

//MARK:TO BE IMPLEMENTED WE NEED APNS

struct NotificationsView: View {
@State private var notifications: [AuctionNotification] = sampleNotifications
@State private var selectedFilter: NotificationFilter = .all
Expand Down Expand Up @@ -119,7 +121,6 @@ struct NotificationsView: View {
}
}

// MARK: - Notification Card
struct NotificationCard: View {
let notification: AuctionNotification
let onTap: () -> Void
Expand Down Expand Up @@ -205,7 +206,6 @@ struct NotificationCard: View {
}
}

// MARK: - Filter Tab
struct FilterTab: View {
let title: String
let count: Int
Expand Down Expand Up @@ -243,7 +243,6 @@ struct FilterTab: View {
}
}

// MARK: - In-App Notification Banner
struct NotificationBanner: View {
let notification: AuctionNotification
@State private var isVisible = false
Expand All @@ -252,7 +251,6 @@ struct NotificationBanner: View {

var body: some View {
HStack(spacing: 12) {
// Icon
ZStack {
Circle()
.fill(notification.type.color)
Expand All @@ -263,7 +261,6 @@ struct NotificationBanner: View {
.foregroundColor(.white)
}

// Content
VStack(alignment: .leading, spacing: 2) {
Text(notification.title)
.font(.custom("Exo2-SemiBold", size: 14))
Expand Down Expand Up @@ -317,24 +314,6 @@ struct NotificationBanner: View {
NotificationsView()
}

// MARK: - Data Models
struct AuctionNotification: Identifiable {
let id = UUID()
let type: NotificationType
let title: String
let message: String
let timestamp: Date
var isRead: Bool = false
let bidAmount: Double?
let auctionId: String

var timeAgo: String {
let formatter = RelativeDateTimeFormatter()
formatter.unitsStyle = .short
return formatter.localizedString(for: timestamp, relativeTo: Date())
}
}

enum NotificationType: CaseIterable {
case ongoing
case newAuction
Expand Down Expand Up @@ -404,6 +383,7 @@ enum NotificationFilter: CaseIterable {
}
}


// MARK: - Sample Data
let sampleNotifications: [AuctionNotification] = [
AuctionNotification(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ class ScheduledAuctionViewModel: ObservableObject {
let message = error.errorDescription?.description ?? "An unexpected error occurred."
uiState.auctionState = .error(message)
uiState.errorMessage = message
//onFailure(message)
}
}
}
Binary file added project/128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/Auction Details.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/Auctions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/Home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/ResetPassword.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/Settings.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/SignIn.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/SignUp.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/Upload Auction.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added project/Wishlist.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading