Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 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
6 changes: 3 additions & 3 deletions ios/Buildings/Package.resolved

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

15 changes: 9 additions & 6 deletions ios/Freerooms/Freerooms/FreeroomsApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ struct FreeroomsApp: App {
let swiftDataStore = try SwiftDataStore<SwiftDataBuilding>(modelContext: FreeroomsApp.sharedContainer.mainContext)
let swiftDataBuildingLoader = LiveSwiftDataBuildingLoader(swiftDataStore: swiftDataStore)

let (roomStatusLoader, buildingRatingLoader, _, _) = makeRemoteLoaders()
let (roomStatusLoader, buildingRatingLoader, _, _, _) = makeRemoteLoaders()

let buildingLoader = LiveBuildingLoader(
swiftDataBuildingLoader: swiftDataBuildingLoader,
Expand Down Expand Up @@ -94,7 +94,7 @@ struct FreeroomsApp: App {
let swiftDataStore = try SwiftDataStore<SwiftDataBuilding>(modelContext: modelContext)
let swiftDataBuildingLoader = LiveSwiftDataBuildingLoader(swiftDataStore: swiftDataStore)

let (roomStatusLoader, buildingRatingLoader, _, _) = makeRemoteLoaders()
let (roomStatusLoader, buildingRatingLoader, _, _, _) = makeRemoteLoaders()

let buildingLoader = LiveBuildingLoader(
swiftDataBuildingLoader: swiftDataBuildingLoader,
Expand Down Expand Up @@ -132,7 +132,7 @@ struct FreeroomsApp: App {
let swiftDataStore = try SwiftDataStore<SwiftDataRoom>(modelContext: FreeroomsApp.sharedContainer.mainContext)
let swiftDataRoomLoader = LiveSwiftDataRoomLoader(swiftDataStore: swiftDataStore)

let (roomStatusLoader, _, remoteBookingLoader, roomRatingLoader) = makeRemoteLoaders()
let (roomStatusLoader, _, remoteBookingLoader, roomRatingLoader, roomFilterLoader) = makeRemoteLoaders()

let roomLoader = LiveRoomLoader(
JSONRoomLoader: JSONRoomLoader,
Expand All @@ -144,7 +144,8 @@ struct FreeroomsApp: App {
let roomService = LiveRoomService(
roomLoader: roomLoader,
roomBookingLoader: roomBookingLoader,
roomRatingLoader: roomRatingLoader)
roomRatingLoader: roomRatingLoader,
roomFilterLoader: roomFilterLoader)
let interactor = RoomInteractor(roomService: roomService, locationService: locationService)

return LiveRoomViewModel(interactor: interactor)
Expand Down Expand Up @@ -191,7 +192,8 @@ struct FreeroomsApp: App {
roomStatusLoader: LiveRoomStatusLoader,
buildingRatingLoader: RemoteBuildingRatingLoader,
remoteBookingLoader: LiveRemoteRoomBookingLoader,
roomRatingLoader: LiveRoomRatingLoader)
roomRatingLoader: LiveRoomRatingLoader,
roomFilterLoader: LiveFilterRoomLoader)
{
let httpClient = makeHTTPClient()
let (stagingURL, productionURL) = makeBaseURLs()
Expand All @@ -200,7 +202,8 @@ struct FreeroomsApp: App {
let buildingRatingLoader = RemoteBuildingRatingLoader(client: httpClient, baseURL: productionURL)
let remoteBookingLoader = LiveRemoteRoomBookingLoader(client: httpClient, baseURL: productionURL)
let roomRatingLoader = LiveRoomRatingLoader(client: httpClient, baseURL: productionURL)
let roomFilterLoader = LiveFilterRoomLoader(client: httpClient, baseURL: productionURL)

return (roomStatusLoader, buildingRatingLoader, remoteBookingLoader, roomRatingLoader)
return (roomStatusLoader, buildingRatingLoader, remoteBookingLoader, roomRatingLoader, roomFilterLoader)
}
}
24 changes: 24 additions & 0 deletions ios/Networking/Package.resolved

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

4 changes: 4 additions & 0 deletions ios/Networking/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@ let package = Package(
],
dependencies: [
.package(name: "TestingSupport", path: "../TestingSupport"),
.package(url: "https://github.com/avdn-dev/VISOR.git", from: "8.0.0"),
],
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
.target(
name: "Networking",
dependencies: [
.product(name: "VISOR", package: "VISOR"),
],
swiftSettings: .defaultSettings),
.target(name: "NetworkingTestUtils", dependencies: ["Networking"], swiftSettings: .defaultSettings),
.testTarget(
Expand Down
9 changes: 6 additions & 3 deletions ios/Networking/Sources/Networking/HTTPClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
//

import Foundation
import VISOR

// MARK: - HTTPClient
public typealias HTTPClientResult = Swift.Result<(Data, HTTPURLResponse), Error>

public protocol HTTPClient {
typealias Result = Swift.Result<(Data, HTTPURLResponse), Error>
// MARK: - HTTPClient

func get(from url: URL) async -> Result
@Spyable
public protocol HTTPClient {
func get(from url: URL) async -> HTTPClientResult
}

// MARK: - HTTPClientError
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public struct URLSessionHTTPClient: HTTPClient, Sendable {

// MARK: Public

public func get(from url: URL) async -> HTTPClient.Result {
public func get(from url: URL) async -> HTTPClientResult {
do {
let (data, urlResponse) = try await session.data(from: url)
guard let httpUrlResponse = urlResponse as? HTTPURLResponse else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class MockHTTPClient: HTTPClient {
stubbedError = NSError(domain: "test", code: 0)
}

public func get(from url: URL) async -> HTTPClient.Result {
public func get(from url: URL) async -> HTTPClientResult {
if let error = stubbedError {
return .failure(error)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ private final class MockHTTPClient: HTTPClient {
returnedStatusCode = 200
}

func get(from url: URL) async -> HTTPClient.Result {
func get(from url: URL) async -> HTTPClientResult {
networkCallCount += 1

if let returnedStringData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ struct URLSessionHTTPClientTests {

// MARK: Private

private func expect(_ res: HTTPClient.Result, toThrow httpClientError: HTTPClientError) {
private func expect(_ res: HTTPClientResult, toThrow httpClientError: HTTPClientError) {
switch res {
case .failure(let error):
#expect(error as? HTTPClientError == httpClientError)
Expand All @@ -96,7 +96,7 @@ struct URLSessionHTTPClientTests {
}
}

private func expect(_ res: HTTPClient.Result, toFetch data: Data, and urlResponse: URLResponse) {
private func expect(_ res: HTTPClientResult, toFetch data: Data, and urlResponse: URLResponse) {
switch res {
case .success(let (data, httpURLResponse)):
#expect(data == data && httpURLResponse == urlResponse)
Expand Down
24 changes: 24 additions & 0 deletions ios/Persistence/Package.resolved

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

48 changes: 48 additions & 0 deletions ios/Rooms/Sources/RoomModels/FilterRoomOptions.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//
// FilterRoomOptions.swift
// Rooms
//
// Created by Yanlin Li on 26/4/2026.
//

import Foundation

public struct FilterRoomOptions: Equatable, Sendable {

// MARK: Lifecycle

public init(
dateTime: String? = nil,
startTime: String? = nil,
endTime: String? = nil,
buildingId: String? = nil,
capacity: Int? = nil,
duration: Int? = nil,
usage: String? = nil,
location: String? = nil,
sortedBySpecificSchoolId: Bool = false)
{
self.dateTime = dateTime
self.startTime = startTime
self.endTime = endTime
self.buildingId = buildingId
self.capacity = capacity
self.duration = duration
self.usage = usage
self.location = location
self.sortedBySpecificSchoolId = sortedBySpecificSchoolId
}

// MARK: Public

public let dateTime: String?
public let startTime: String?
public let endTime: String?
public let buildingId: String?
public let capacity: Int?
public let duration: Int?
public let usage: String?
public let location: String?
public let sortedBySpecificSchoolId: Bool

}
25 changes: 25 additions & 0 deletions ios/Rooms/Sources/RoomModels/RemoteFilterRoom.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// RemoteFilterRoom.swift
// Rooms
//
// Created by Yanlin Li on 26/4/2026.
//

import Foundation

public typealias RemoteFilterRoomMap = [String: RemoteFilterRoomValue]

// MARK: - RemoteFilterRoomValue

/// Represents the details of a room returned from the remote API when fetching filtered rooms.
public struct RemoteFilterRoomValue: Codable, Equatable, Sendable {
public let status: String
public let endTime: String
public let name: String

enum CodingKeys: String, CodingKey {
case status
case endTime = "endtime"
case name
}
}
Loading
Loading