fix(account): load permanent referral profiles
CI / Validate manifests (push) Has been cancelled
CI / SwiftLint (push) Has been cancelled
CI / iOS / Extension (push) Has been cancelled
CI / macOS (push) Has been cancelled

Use authenticated server invitation URLs with account-scoped caching and bounded state transitions, then advance the iOS build metadata to 86.
This commit is contained in:
Rocky
2026-08-20 22:59:58 +08:00
parent ca0a1f9b9a
commit 7bd77509b6
19 changed files with 1151 additions and 228 deletions
@@ -485,7 +485,7 @@ public actor AccountAPIClient {
}
var request = URLRequest(url: url)
request.httpMethod = resource.method
request.timeoutInterval = 30
request.timeoutInterval = resource == .referralProfile ? 15 : 30
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
if resource == .creditsBalance {
@@ -504,6 +504,10 @@ public actor AccountAPIClient {
private func send(_ request: URLRequest) async throws -> (data: Data, response: HTTPURLResponse) {
do {
return try await transport.data(for: request)
} catch is CancellationError {
throw CancellationError()
} catch let error as URLError where error.code == .cancelled {
throw CancellationError()
} catch let error as AccountAPIError {
throw error
} catch {
@@ -54,7 +54,6 @@ public enum AccountAuthorizedResource: Sendable, Equatable {
case referralProfile
case referralCampaigns
case referrals(limit: Int)
case createReferralCode
case redeemReferral
case storeKitProducts
case storeKitTransactions(limit: Int, cursor: String?)
@@ -63,7 +62,7 @@ public enum AccountAuthorizedResource: Sendable, Equatable {
var method: String {
switch self {
case .createReferralCode, .redeemReferral, .submitStoreKitTransaction:
case .redeemReferral, .submitStoreKitTransaction:
return "POST"
case .revokeGatewayGrant:
return "DELETE"
@@ -82,8 +81,6 @@ public enum AccountAuthorizedResource: Sendable, Equatable {
return "/v1/referrals/campaigns"
case .referrals(let limit):
return "/v1/referrals?limit=\(min(max(limit, 1), 100))"
case .createReferralCode:
return "/v1/referrals/code"
case .redeemReferral:
return "/v1/referrals/redeem"
case .storeKitProducts: