diff --git a/TorqueNet.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate b/TorqueNet.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate index 30101df..41ff121 100644 Binary files a/TorqueNet.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate and b/TorqueNet.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TorqueNet/Features/Auction/Data/Repository/AuctionUploadRepositoryImpl.swift b/TorqueNet/Features/Auction/Data/Repository/AuctionUploadRepositoryImpl.swift index 6c6a8be..0b77b5d 100644 --- a/TorqueNet/Features/Auction/Data/Repository/AuctionUploadRepositoryImpl.swift +++ b/TorqueNet/Features/Auction/Data/Repository/AuctionUploadRepositoryImpl.swift @@ -142,14 +142,14 @@ class AuctionUploadRepositoryImpl: AuctionUploadRepository { func fetchBids(auctionId: String) async -> Result<[AuctionBidModel], UploadError> { do { let snapshot = try await FirestoreConstants.BidsCollection - .document(auctionId) - .getDocument() - let auctionBids = try snapshot.data(as: [AuctionBidModel].self) - if auctionBids.isEmpty { - return .success([]) - } + .getDocuments() - return .success(auctionBids) + let auctionBids: [AuctionBidModel] = snapshot.documents.compactMap { document in + try? document.data(as: AuctionBidModel.self) + } + + let finalAuctionBids = auctionBids.filter { $0.auctionId.contains(auctionId)} + return .success(finalAuctionBids) } catch { return .failure( diff --git a/TorqueNet/Features/Auction/Domain/Model/AuctionBidModel.swift b/TorqueNet/Features/Auction/Domain/Model/AuctionBidModel.swift index 598f788..d2d4635 100644 --- a/TorqueNet/Features/Auction/Domain/Model/AuctionBidModel.swift +++ b/TorqueNet/Features/Auction/Domain/Model/AuctionBidModel.swift @@ -9,12 +9,14 @@ import FirebaseCore struct AuctionBidModel: Identifiable, Codable { let id: String + let auctionId: String let bidUser: String let bidAmount: Double let bidTime: Timestamp enum CodingKeys: String, CodingKey { case id + case auctionId case bidUser = "bid_user" case bidAmount = "bid_amount" case bidTime = "bid_time" diff --git a/TorqueNet/Features/Auction/Domain/UseCase/UploadAuctionUseCase.swift b/TorqueNet/Features/Auction/Domain/UseCase/UploadAuctionUseCase.swift index b70031b..c07587c 100644 --- a/TorqueNet/Features/Auction/Domain/UseCase/UploadAuctionUseCase.swift +++ b/TorqueNet/Features/Auction/Domain/UseCase/UploadAuctionUseCase.swift @@ -196,6 +196,7 @@ class UploadAuctionUseCase { } func placeBid( + auctionId: String, bidUser:String, bidAmount:String, ) async -> Result { @@ -208,6 +209,7 @@ class UploadAuctionUseCase { let bidAuction = AuctionBidModel( id:auctionBidId, + auctionId: auctionId, bidUser:bidUser, bidAmount:bidAmount, bidTime: Timestamp(date: Date()) diff --git a/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionCarDetailView.swift b/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionCarDetailView.swift index 496d0ff..32f4db0 100644 --- a/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionCarDetailView.swift +++ b/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionCarDetailView.swift @@ -112,6 +112,7 @@ struct AuctionCarDetailView: View { onBidSubmitted: { amount in Task{ await auctionDetailViewModel.placeBid( + auctionId: auctionId, bidUser: settingsViewModel.currentUser?.name ?? "", onSuccess: { auctionDetailViewModel.auctionDetailsUiState.toast = Toast(style: .success, message: "Bid placed successfully") @@ -291,7 +292,6 @@ struct AuctionCarDetailView: View { } } - // Key Specs HStack(spacing: 20) { if let auction = auction { SpecBadge(icon: "speedometer", value: auction.mileage, unit: "miles") @@ -323,7 +323,7 @@ struct AuctionCarDetailView: View { Image(systemName: "arrow.up") .foregroundColor(.green) .font(.system(size: 12)) - Text("\(auction?.bidCount) bids") + Text("\(auctionDetailViewModel.sortedBids.count) bids") .font(.custom("Exo2-Medium", size: 12)) .foregroundColor(.theme.onSurfaceColor.opacity(0.7)) } @@ -340,18 +340,19 @@ struct AuctionCarDetailView: View { .font(.custom("Exo2-Bold", size: 20)) .foregroundColor(auctionDetailViewModel.auctionDetailsUiState.timeRemaining > 3600 ? .green : .orange) - HStack(spacing: 4) { - Circle() - .fill(.green) - .frame(width: 8, height: 8) - Text("Live Bidding") - .font(.custom("Exo2-Medium", size: 12)) - .foregroundColor(.theme.onSurfaceColor.opacity(0.7)) + if (auctionDetailViewModel.auctionDetailsUiState.fetchedAuction?.auctionStatus == "Ongoing"){ + HStack(spacing: 4) { + Circle() + .fill(.green) + .frame(width: 8, height: 8) + Text("Live Bidding") + .font(.custom("Exo2-Medium", size: 12)) + .foregroundColor(.theme.onSurfaceColor.opacity(0.7)) + } } } } - // Bid History Preview bidHistoryPreview } .padding(20) @@ -503,7 +504,7 @@ struct AuctionCarDetailView: View { Spacer() - Text("\(auction?.rating.rounded())/10") + Text("\(auction?.rating.rounded() ?? 0)/10") .font(.custom("Exo2-Bold", size: 18)) .foregroundColor(.green) } diff --git a/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionDetailsViewModel.swift b/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionDetailsViewModel.swift index 0736b79..903eaee 100644 --- a/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionDetailsViewModel.swift +++ b/TorqueNet/Features/Auction/Presentation/AuctionDetails/AuctionDetailsViewModel.swift @@ -50,12 +50,13 @@ class AuctionDetailsViewModel: ObservableObject { } func placeBid( + auctionId:String, bidUser:String, onSuccess: () -> Void, onFailure: (String) -> Void) async { auctionDetailsUiState.auctionState = .isLoading - let result = await auctionUseCase.placeBid(bidUser: bidUser, bidAmount: auctionDetailsUiState.bidAmount) + let result = await auctionUseCase.placeBid(auctionId:auctionId,bidUser: bidUser, bidAmount: auctionDetailsUiState.bidAmount) switch result { case .success(let id): @@ -85,10 +86,12 @@ class AuctionDetailsViewModel: ObservableObject { switch result { case .success(let bids): self.auctionDetailsUiState.fetchedBids = bids + print ("Vm Fetched bids: \(bids)") auctionDetailsUiState.auctionState = .good onSuccess() case .failure(let error): let message = error.errorDescription?.description ?? "An unexpected error occurred." + print("FetchBids Error: \(message)") auctionDetailsUiState.auctionState = .error(message) auctionDetailsUiState.errorMessage = message auctionDetailsUiState.showError = true