From 492d997892f368299197707f00d03ae2eb1164b9 Mon Sep 17 00:00:00 2001 From: cheykrym Date: Sat, 13 Dec 2025 05:58:50 +0300 Subject: [PATCH] fix self rating --- yobble/Network/ProfileModels.swift | 35 ++++++++++++++++++++ yobble/Views/Tab/Settings/SettingsView.swift | 20 ++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/yobble/Network/ProfileModels.swift b/yobble/Network/ProfileModels.swift index 71f20c4..fbce3d7 100644 --- a/yobble/Network/ProfileModels.swift +++ b/yobble/Network/ProfileModels.swift @@ -11,6 +11,7 @@ struct ProfileDataPayload: Decodable { let isVerified: Bool let stories: [JSONValue] let profilePermissions: ProfilePermissionsPayload + let rating: Double? private enum CodingKeys: String, CodingKey { case userId @@ -23,6 +24,7 @@ struct ProfileDataPayload: Decodable { case isVerified case stories case profilePermissions + case rating } init(from decoder: Decoder) throws { @@ -37,6 +39,39 @@ struct ProfileDataPayload: Decodable { self.isVerified = try container.decode(Bool.self, forKey: .isVerified) self.stories = try container.decodeIfPresent([JSONValue].self, forKey: .stories) ?? [] self.profilePermissions = try container.decode(ProfilePermissionsPayload.self, forKey: .profilePermissions) + let ratingPayload = try container.decodeIfPresent(ProfileRatingPayload.self, forKey: .rating) + self.rating = ratingPayload?.resolvedRating + } +} + +private struct ProfileRatingPayload: Decodable { + let status: String? + let rating: Double? + + private enum CodingKeys: String, CodingKey { + case rating + case status + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + status = try container.decodeIfPresent(String.self, forKey: .status) + + if let doubleValue = try? container.decode(Double.self, forKey: .rating) { + rating = doubleValue + } else if let stringValue = try? container.decode(String.self, forKey: .rating), + let doubleValue = Double(stringValue) { + rating = doubleValue + } else if let intValue = try? container.decode(Int.self, forKey: .rating) { + rating = Double(intValue) + } else { + rating = nil + } + } + + var resolvedRating: Double? { + guard status?.lowercased() == "fine" else { return nil } + return rating } } diff --git a/yobble/Views/Tab/Settings/SettingsView.swift b/yobble/Views/Tab/Settings/SettingsView.swift index 83948ca..b677c4b 100644 --- a/yobble/Views/Tab/Settings/SettingsView.swift +++ b/yobble/Views/Tab/Settings/SettingsView.swift @@ -376,6 +376,14 @@ struct SettingsView: View { return formatter }() + private static let ratingFormatter: NumberFormatter = { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.minimumFractionDigits = 1 + formatter.maximumFractionDigits = 1 + return formatter + }() + @ViewBuilder private var aboutSection: some View { if let _ = messengerProfile { @@ -472,7 +480,17 @@ struct SettingsView: View { } private var ratingDisplayValue: String { - NSLocalizedString("Недоступно", comment: "Messenger settings rating unavailable") + guard let rating = messengerProfile?.rating else { + return NSLocalizedString("Недоступно", comment: "Messenger settings rating unavailable") + } + + let clamped = max(0, min(5, rating)) + let formatted = SettingsView.ratingFormatter.string(from: NSNumber(value: clamped)) + ?? String(format: "%.1f", clamped) + return String( + format: NSLocalizedString("%@ из 5", comment: "Message profile rating format"), + formatted + ) } }