Skip to content

Commit 774bfb6

Browse files
committed
Доработки в списке пользователей
- Анимируем принятие заявки в друзья - После принятия заявки в друзья обновляем список друзей и отображаем нового друга - После ответа на заявку в друзья убираем эту заявку из списка на экране - При рефреше на экране с черным списком закрываем экран, если сервер прислал пустой черный список
1 parent f786088 commit 774bfb6

File tree

2 files changed

+58
-37
lines changed

2 files changed

+58
-37
lines changed

SwiftUI-WorkoutApp/Libraries/SWNetwork/Sources/SWNetwork/SWNetwork.swift

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,15 +163,20 @@ private extension SWNetworkService {
163163
/// - Returns: Новая ошибка
164164
@discardableResult
165165
func handleUrlSession(_ error: Error, _ request: URLRequest) -> Error {
166-
if (error as NSError).code == -999 {
167-
assertionFailure("Запрос отменён! Код ошибки: -999")
166+
let errorCode = (error as NSError).code
167+
if errorCode == -999 {
168+
let message = "Запрос отменён! Код ошибки: -999. URL запроса: \(request.urlString)"
169+
logger.error("\(message)")
170+
} else {
171+
logger.error(
172+
"""
173+
Ошибка!
174+
\(error.localizedDescription, privacy: .public)
175+
Код ошибки: \(errorCode, privacy: .public)
176+
\nURL запроса: \(request.urlString, privacy: .public)
177+
"""
178+
)
168179
}
169-
logger.error(
170-
"""
171-
\(error.localizedDescription, privacy: .public)
172-
\nURL запроса: \(request.urlString, privacy: .public)
173-
"""
174-
)
175180
guard let urlError = error as? URLError else {
176181
return error
177182
}

SwiftUI-WorkoutApp/Screens/Common/UsersListScreen.swift

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import SWUtils
66

77
/// Экран со списком пользователей
88
struct UsersListScreen: View {
9+
@Environment(\.dismiss) private var dismiss
910
@Environment(\.isNetworkConnected) private var isNetworkConnected
1011
@EnvironmentObject private var defaults: DefaultsService
1112
@State private var users = [UserResponse]()
@@ -21,20 +22,10 @@ struct UsersListScreen: View {
2122
ScrollView {
2223
VStack(spacing: 0) {
2324
friendRequestsSectionIfNeeded
24-
SectionView(
25-
header: friendRequests.isEmpty ? nil : "Друзья",
26-
mode: .regular
27-
) {
28-
LazyVStack(spacing: 12) {
29-
ForEach(users) { item in
30-
listItem(for: item)
31-
.disabled(item.id == defaults.mainUserInfo?.id)
32-
}
33-
}
34-
}
35-
.padding(.top)
25+
friendsSectionIfNeeded
3626
}
3727
.padding(.horizontal)
28+
.frame(maxWidth: .infinity)
3829
}
3930
.sheet(
4031
item: $messagingModel.recipient,
@@ -98,6 +89,27 @@ private extension UsersListScreen {
9889
}
9990
}
10091

92+
@ViewBuilder
93+
var friendsSectionIfNeeded: some View {
94+
ZStack {
95+
if !users.isEmpty {
96+
SectionView(
97+
header: friendRequests.isEmpty ? nil : "Друзья",
98+
mode: .regular
99+
) {
100+
LazyVStack(spacing: 12) {
101+
ForEach(users) { item in
102+
listItem(for: item)
103+
.disabled(item.id == defaults.mainUserInfo?.id)
104+
}
105+
}
106+
}
107+
}
108+
}
109+
.animation(.default, value: users)
110+
.padding(.top)
111+
}
112+
101113
@ViewBuilder
102114
func listItem(for model: UserResponse) -> some View {
103115
switch mode {
@@ -166,28 +178,20 @@ private extension UsersListScreen {
166178
case let .friends(userID), let .friendsForChat(userID):
167179
if !users.isEmpty, !refresh { return }
168180
if !refresh { isLoading = true }
169-
let isMainUser = userID == defaults.mainUserInfo?.id
170-
let response = try await client.getFriendsForUser(id: userID)
171-
if isMainUser {
172-
try? defaults.saveFriendsIds(response.map(\.id))
173-
if defaults.friendRequestsList.isEmpty || refresh {
174-
friendRequests = try await client.getFriendRequests()
175-
try? defaults.saveFriendRequests(friendRequests)
176-
} else {
177-
friendRequests = defaults.friendRequestsList
178-
}
181+
if userID == defaults.mainUserInfo?.id {
182+
try await makeListForMainUser(userID)
183+
} else {
184+
users = try await client.getFriendsForUser(id: userID)
179185
}
180-
users = response
181186
case let .eventParticipants(list), let .parkParticipants(list):
182187
users = list
183188
case .blacklist:
184189
if !users.isEmpty, !refresh { return }
185190
if !refresh { isLoading = true }
186-
if defaults.blacklistedUsers.isEmpty || refresh {
187-
users = try await client.getBlacklist()
188-
try? defaults.saveBlacklist(users)
189-
} else {
190-
users = defaults.blacklistedUsers
191+
users = try await client.getBlacklist()
192+
try? defaults.saveBlacklist(users)
193+
if users.isEmpty {
194+
dismiss()
191195
}
192196
}
193197
} catch {
@@ -202,14 +206,26 @@ private extension UsersListScreen {
202206
do {
203207
let isSuccess = try await client.respondToFriendRequest(from: userID, accept: accept)
204208
if isSuccess {
205-
await askForUsers(refresh: true)
209+
friendRequests.removeAll(where: { $0.id == userID })
210+
try await makeListForMainUser(defaults.mainUserInfo?.id)
206211
}
207212
} catch {
208213
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
209214
}
210215
isLoading = false
211216
}
212217
}
218+
219+
func makeListForMainUser(_ id: Int?) async throws {
220+
guard let id else { return }
221+
async let friendsTask = client.getFriendsForUser(id: id)
222+
async let requestsTask = client.getFriendRequests()
223+
let (friends, requests) = try await (friendsTask, requestsTask)
224+
try? defaults.saveFriendsIds(friends.map(\.id))
225+
try? defaults.saveFriendRequests(requests)
226+
users = friends
227+
friendRequests = requests
228+
}
213229
}
214230

215231
#if DEBUG

0 commit comments

Comments
 (0)