Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
4 changes: 2 additions & 2 deletions SwiftUI-WorkoutApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 9;
CURRENT_PROJECT_VERSION = 10;
DEVELOPMENT_ASSET_PATHS = "SwiftUI-WorkoutApp/Preview\\ Content/PreviewContent.swift SwiftUI-WorkoutApp/Preview\\ Content";
DEVELOPMENT_TEAM = CR68PP2Z3F;
ENABLE_PREVIEWS = YES;
Expand Down Expand Up @@ -907,7 +907,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 9;
CURRENT_PROJECT_VERSION = 10;
DEVELOPMENT_ASSET_PATHS = "SwiftUI-WorkoutApp/Preview\\ Content/PreviewContent.swift SwiftUI-WorkoutApp/Preview\\ Content";
DEVELOPMENT_TEAM = CR68PP2Z3F;
ENABLE_PREVIEWS = YES;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,15 +163,20 @@ private extension SWNetworkService {
/// - Returns: Новая ошибка
@discardableResult
func handleUrlSession(_ error: Error, _ request: URLRequest) -> Error {
if (error as NSError).code == -999 {
assertionFailure("Запрос отменён! Код ошибки: -999")
let errorCode = (error as NSError).code
if errorCode == -999 {
let message = "Запрос отменён! Код ошибки: -999. URL запроса: \(request.urlString)"
logger.error("\(message)")
} else {
logger.error(
"""
Ошибка!
\(error.localizedDescription, privacy: .public)
Код ошибки: \(errorCode, privacy: .public)
\nURL запроса: \(request.urlString, privacy: .public)
"""
)
}
logger.error(
"""
\(error.localizedDescription, privacy: .public)
\nURL запроса: \(request.urlString, privacy: .public)
"""
)
guard let urlError = error as? URLError else {
return error
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ public final class SWAlert {
topMostViewController.present(alert, animated: true)
}

/// Показывает стандартный алерт с сообщение об ошибке
///
/// Игнорирует `CancellationError`
public func presentDefaultUIKit(_ error: Error) {
guard (error as NSError).code != -999 else { return }
presentDefaultUIKit(message: error.localizedDescription)
}

private func dismiss() {
currentAlert?.dismiss(animated: true)
currentAlert = nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ struct ModernPickedImagesGrid: View {
let newImages = try await loadImages(from: selectedItems)
images.append(contentsOf: newImages)
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
selectedItems.removeAll()
isLoading.toggle()
Expand Down
2 changes: 1 addition & 1 deletion SwiftUI-WorkoutApp/Screens/Common/TextEntryScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ private extension TextEntryScreen {
}
if isSuccess { refreshClbk() }
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down
80 changes: 48 additions & 32 deletions SwiftUI-WorkoutApp/Screens/Common/UsersListScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import SWUtils

/// Экран со списком пользователей
struct UsersListScreen: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.isNetworkConnected) private var isNetworkConnected
@EnvironmentObject private var defaults: DefaultsService
@State private var users = [UserResponse]()
Expand All @@ -21,20 +22,10 @@ struct UsersListScreen: View {
ScrollView {
VStack(spacing: 0) {
friendRequestsSectionIfNeeded
SectionView(
header: friendRequests.isEmpty ? nil : "Друзья",
mode: .regular
) {
LazyVStack(spacing: 12) {
ForEach(users) { item in
listItem(for: item)
.disabled(item.id == defaults.mainUserInfo?.id)
}
}
}
.padding(.top)
friendsSectionIfNeeded
}
.padding(.horizontal)
.frame(maxWidth: .infinity)
}
.sheet(
item: $messagingModel.recipient,
Expand Down Expand Up @@ -98,6 +89,27 @@ private extension UsersListScreen {
}
}

@ViewBuilder
var friendsSectionIfNeeded: some View {
ZStack {
if !users.isEmpty {
SectionView(
header: friendRequests.isEmpty ? nil : "Друзья",
mode: .regular
) {
LazyVStack(spacing: 12) {
ForEach(users) { item in
listItem(for: item)
.disabled(item.id == defaults.mainUserInfo?.id)
}
}
}
}
}
.animation(.default, value: users)
.padding(.top)
}

@ViewBuilder
func listItem(for model: UserResponse) -> some View {
switch mode {
Expand Down Expand Up @@ -146,7 +158,7 @@ private extension UsersListScreen {
let isSuccess = try await client.sendMessage(messagingModel.message, to: userID)
endMessaging(isSuccess: isSuccess)
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
messagingModel.isLoading = false
}
Expand All @@ -166,32 +178,24 @@ private extension UsersListScreen {
case let .friends(userID), let .friendsForChat(userID):
if !users.isEmpty, !refresh { return }
if !refresh { isLoading = true }
let isMainUser = userID == defaults.mainUserInfo?.id
let response = try await client.getFriendsForUser(id: userID)
if isMainUser {
try? defaults.saveFriendsIds(response.map(\.id))
if defaults.friendRequestsList.isEmpty || refresh {
friendRequests = try await client.getFriendRequests()
try? defaults.saveFriendRequests(friendRequests)
} else {
friendRequests = defaults.friendRequestsList
}
if userID == defaults.mainUserInfo?.id {
try await makeListForMainUser(userID)
} else {
users = try await client.getFriendsForUser(id: userID)
}
users = response
case let .eventParticipants(list), let .parkParticipants(list):
users = list
case .blacklist:
if !users.isEmpty, !refresh { return }
if !refresh { isLoading = true }
if defaults.blacklistedUsers.isEmpty || refresh {
users = try await client.getBlacklist()
try? defaults.saveBlacklist(users)
} else {
users = defaults.blacklistedUsers
users = try await client.getBlacklist()
try? defaults.saveBlacklist(users)
if users.isEmpty {
dismiss()
}
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand All @@ -202,14 +206,26 @@ private extension UsersListScreen {
do {
let isSuccess = try await client.respondToFriendRequest(from: userID, accept: accept)
if isSuccess {
await askForUsers(refresh: true)
friendRequests.removeAll(where: { $0.id == userID })
try await makeListForMainUser(defaults.mainUserInfo?.id)
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
}

func makeListForMainUser(_ id: Int?) async throws {
guard let id else { return }
async let friendsTask = client.getFriendsForUser(id: id)
async let requestsTask = client.getFriendRequests()
let (friends, requests) = try await (friendsTask, requestsTask)
try? defaults.saveFriendsIds(friends.map(\.id))
try? defaults.saveFriendRequests(requests)
users = friends
friendRequests = requests
}
}

#if DEBUG
Expand Down
10 changes: 5 additions & 5 deletions SwiftUI-WorkoutApp/Screens/Events/EventDetailsScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ private extension EventDetailsScreen {
onDeletion(event.id)
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down Expand Up @@ -228,7 +228,7 @@ private extension EventDetailsScreen {
event.trainHere = oldValue
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
event.trainHere = oldValue
}
isLoading = false
Expand Down Expand Up @@ -343,7 +343,7 @@ private extension EventDetailsScreen {
do {
event = try await SWClient(with: defaults).getEvent(by: event.id)
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand All @@ -356,7 +356,7 @@ private extension EventDetailsScreen {
event.comments.removeAll(where: { $0.id == id })
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand All @@ -372,7 +372,7 @@ private extension EventDetailsScreen {
event.photos = event.removePhotoById(id)
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down
2 changes: 1 addition & 1 deletion SwiftUI-WorkoutApp/Screens/Events/EventFormScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private extension EventFormScreen {
dismiss()
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down
2 changes: 1 addition & 1 deletion SwiftUI-WorkoutApp/Screens/Events/EventsListScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ private extension EventsListScreen {
if selectedEventType == .past {
pastEventStorage.loadIfNeeded(&pastEvents)
}
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down
6 changes: 3 additions & 3 deletions SwiftUI-WorkoutApp/Screens/Messages/DialogScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ private extension DialogScreen {
markedAsReadClbk(dialog)
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
}

Expand All @@ -172,7 +172,7 @@ private extension DialogScreen {
do {
messages = try await SWClient(with: defaults).getMessages(for: dialog.id).reversed()
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand All @@ -188,7 +188,7 @@ private extension DialogScreen {
await askForMessages(refresh: true)
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down
4 changes: 2 additions & 2 deletions SwiftUI-WorkoutApp/Screens/Messages/DialogsListScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ private extension DialogsListScreen {
do {
try await viewModel.askForDialogs(refresh: refresh, defaults: defaults)
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
}

Expand All @@ -178,7 +178,7 @@ private extension DialogsListScreen {
do {
try await viewModel.deleteDialog(at: index, defaults: defaults)
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions SwiftUI-WorkoutApp/Screens/Parks/Map/ParksMapScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ private extension ParksMapScreen {
do {
try parksManager.makeDefaultList()
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
// Если прошло больше одного дня с момента предыдущего обновления, делаем обновление
if parksManager.needUpdateDefaultList {
Expand All @@ -206,7 +206,7 @@ private extension ParksMapScreen {
do {
try parksManager.deletePark(with: id)
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
}

Expand All @@ -224,7 +224,7 @@ private extension ParksMapScreen {
let updatedParks = try await SWClient(with: defaults).getUpdatedParks(from: dateString)
try parksManager.updateDefaultList(with: updatedParks)
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down
2 changes: 1 addition & 1 deletion SwiftUI-WorkoutApp/Screens/Parks/ParkDetailScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,7 @@ private extension ParkDetailScreen {
)
onDeletion(park.id)
} else {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion SwiftUI-WorkoutApp/Screens/Parks/ParkFormScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ private extension ParkFormScreen {
refreshClbk()
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand Down
4 changes: 2 additions & 2 deletions SwiftUI-WorkoutApp/Screens/Parks/ParksListScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ private extension ParksListScreen {
parks = list
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
isLoading = false
}
Expand All @@ -148,7 +148,7 @@ private extension ParksListScreen {
dismiss()
}
} catch {
SWAlert.shared.presentDefaultUIKit(message: error.localizedDescription)
SWAlert.shared.presentDefaultUIKit(error)
}
}
}
Expand Down
Loading