@@ -6,6 +6,7 @@ import SWUtils
66
77/// Экран со списком пользователей
88struct 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