Skip to content

Commit 4d888ae

Browse files
authored
Доработка isNetworkConnected (#314)
- Если нет сети, не даем совершить финальное действие с сервером (сохранить изменения, например), но добраться до любого экрана даем - К базовой загрузке данных на экране это пока не относится - грузим независимо от наличия интернета
1 parent 214d7f3 commit 4d888ae

28 files changed

+113
-74
lines changed

SwiftUI-WorkoutApp.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -879,7 +879,7 @@
879879
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
880880
CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES;
881881
CODE_SIGN_STYLE = Automatic;
882-
CURRENT_PROJECT_VERSION = 5;
882+
CURRENT_PROJECT_VERSION = 6;
883883
DEVELOPMENT_ASSET_PATHS = "SwiftUI-WorkoutApp/Preview\\ Content/PreviewContent.swift SwiftUI-WorkoutApp/Preview\\ Content";
884884
DEVELOPMENT_TEAM = CR68PP2Z3F;
885885
ENABLE_PREVIEWS = YES;
@@ -932,7 +932,7 @@
932932
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
933933
CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES;
934934
CODE_SIGN_STYLE = Automatic;
935-
CURRENT_PROJECT_VERSION = 5;
935+
CURRENT_PROJECT_VERSION = 6;
936936
DEVELOPMENT_ASSET_PATHS = "SwiftUI-WorkoutApp/Preview\\ Content/PreviewContent.swift SwiftUI-WorkoutApp/Preview\\ Content";
937937
DEVELOPMENT_TEAM = CR68PP2Z3F;
938938
ENABLE_PREVIEWS = YES;

SwiftUI-WorkoutApp/Libraries/SWModels/Sources/SWModels/LoginCredentials.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public struct LoginCredentials: Equatable {
2222

2323
public var canRestorePassword: Bool { !login.isEmpty }
2424

25-
public func canLogIn(isError: Bool, isNetworkConnected: Bool) -> Bool {
26-
isReady && !isError && isNetworkConnected
25+
public func canLogIn(isError: Bool) -> Bool {
26+
isReady && !isError
2727
}
2828
}

SwiftUI-WorkoutApp/Libraries/SWModels/Tests/SWModelsTest/LoginCredentialsTests.swift

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,30 +93,18 @@ struct LoginCredentialsTests {
9393
@Test
9494
func testCanLogIn_AllConditionsMet() {
9595
let credentials = LoginCredentials(login: "user", password: "123456")
96-
#expect(credentials.canLogIn(isError: false, isNetworkConnected: true))
96+
#expect(credentials.canLogIn(isError: false))
9797
}
9898

9999
@Test
100100
func testCanLogIn_WhenNotReady() {
101101
let credentials = LoginCredentials(login: "user", password: "123")
102-
#expect(!credentials.canLogIn(isError: false, isNetworkConnected: true))
102+
#expect(!credentials.canLogIn(isError: false))
103103
}
104104

105105
@Test
106106
func testCanLogIn_WithError() {
107107
let credentials = LoginCredentials(login: "user", password: "123456")
108-
#expect(!credentials.canLogIn(isError: true, isNetworkConnected: true))
109-
}
110-
111-
@Test
112-
func testCanLogIn_NoNetwork() {
113-
let credentials = LoginCredentials(login: "user", password: "123456")
114-
#expect(!credentials.canLogIn(isError: false, isNetworkConnected: false))
115-
}
116-
117-
@Test
118-
func testCanLogIn_MultipleIssues() {
119-
let credentials = LoginCredentials(login: "user", password: "123")
120-
#expect(!credentials.canLogIn(isError: true, isNetworkConnected: false))
108+
#expect(!credentials.canLogIn(isError: true))
121109
}
122110
}

SwiftUI-WorkoutApp/Libraries/SWUtils/Sources/SWUtils/SWAlert.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ public final class SWAlert {
4848
presentDefaultUIKit(message: error.localizedDescription)
4949
}
5050

51+
/// Показывает алерт об отсутствии интернета
52+
/// - Parameter isConnected: Состояние подключения к сети
53+
/// - Returns: `true` - нужно показать алерт (нет сети), `false` - алерт не нужен (сеть есть)
54+
@discardableResult
55+
public func presentNoConnection(_ isConnected: Bool) -> Bool {
56+
let showAlert = !isConnected
57+
if showAlert {
58+
presentDefaultUIKit(
59+
title: NSLocalizedString("Нет соединения с сетью", comment: ""),
60+
message: NSLocalizedString("Проверьте подключение и повторите попытку", comment: "")
61+
)
62+
}
63+
return showAlert
64+
}
65+
5166
private func dismiss() {
5267
currentAlert?.dismiss(animated: true)
5368
currentAlert = nil
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import Foundation
2+
@testable import SWUtils
3+
import Testing
4+
5+
@MainActor
6+
struct SWAlertTests {
7+
@Test
8+
func noConnection_showAlert() {
9+
let isConnected = false
10+
let showAlert = SWAlert.shared.presentNoConnection(isConnected)
11+
#expect(showAlert, "Если нет подключения, нужно показать алерт")
12+
}
13+
14+
@Test
15+
func noConnection_doNotShowAlert() {
16+
let isConnected = true
17+
let showAlert = SWAlert.shared.presentNoConnection(isConnected)
18+
#expect(!showAlert, "Если подключение есть, алерт показывать не нужно")
19+
}
20+
}

SwiftUI-WorkoutApp/Resources/Localizable.xcstrings

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3328,6 +3328,23 @@
33283328
}
33293329
}
33303330
},
3331+
"Проверьте подключение и повторите попытку" : {
3332+
"extractionState" : "manual",
3333+
"localizations" : {
3334+
"en" : {
3335+
"stringUnit" : {
3336+
"state" : "translated",
3337+
"value" : "Check your connection and try again"
3338+
}
3339+
},
3340+
"ru" : {
3341+
"stringUnit" : {
3342+
"state" : "translated",
3343+
"value" : "Проверьте подключение и повторите попытку"
3344+
}
3345+
}
3346+
}
3347+
},
33313348
"Профиль" : {
33323349
"localizations" : {
33333350
"en" : {

SwiftUI-WorkoutApp/Screens/Common/LoginScreen.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ private extension LoginScreen {
5050
}
5151

5252
var canLogIn: Bool {
53-
credentials.canLogIn(isError: isError, isNetworkConnected: isNetworkConnected)
53+
credentials.canLogIn(isError: isError)
5454
}
5555

5656
var loginField: some View {
@@ -100,6 +100,7 @@ private extension LoginScreen {
100100

101101
func loginAction() {
102102
guard !isLoading else { return }
103+
guard !SWAlert.shared.presentNoConnection(isNetworkConnected) else { return }
103104
focus = nil
104105
isLoading = true
105106
loginTask = Task {
@@ -126,6 +127,7 @@ private extension LoginScreen {
126127
)
127128
return
128129
}
130+
guard !SWAlert.shared.presentNoConnection(isNetworkConnected) else { return }
129131
clearErrorMessages()
130132
isLoading.toggle()
131133
resetPasswordTask = Task {
@@ -157,5 +159,6 @@ private extension LoginScreen {
157159
#if DEBUG
158160
#Preview {
159161
LoginScreen()
162+
.environment(\.isNetworkConnected, false)
160163
}
161164
#endif

SwiftUI-WorkoutApp/Screens/Common/PhotoSection/PhotoDetailScreen.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import SwiftUI
55
///
66
/// Можно пожаловаться на фото или удалить его (в некоторых сценариях)
77
struct PhotoDetailScreen: View {
8-
@Environment(\.isNetworkConnected) private var isNetworkConnected
98
@Environment(\.dismiss) private var dismiss
109
@State private var showDeleteDialog = false
1110
@State private var showReportDialog = false
@@ -48,7 +47,6 @@ private extension PhotoDetailScreen {
4847
Button("Закрыть") { dismiss() }
4948
Spacer()
5049
trailingButton
51-
.disabled(!isNetworkConnected)
5250
}
5351
.tint(.swAccent)
5452
.padding(.horizontal)

SwiftUI-WorkoutApp/Screens/Common/SendMessageScreen.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import SWDesignSystem
22
import SwiftUI
3+
import SWUtils
34

45
/// Универсальный экран для отправки текста на сервер
56
struct SendMessageScreen: View {
@@ -46,11 +47,12 @@ struct SendMessageScreen: View {
4647
private extension SendMessageScreen {
4748
var sendButton: some View {
4849
Button("Отправить") {
50+
guard !SWAlert.shared.presentNoConnection(isNetworkConnected) else { return }
4951
isFocused = false
5052
sendAction()
5153
}
5254
.buttonStyle(SWButtonStyle(mode: .filled, size: .large))
53-
.disabled(isSendButtonDisabled || !isNetworkConnected)
55+
.disabled(isSendButtonDisabled)
5456
}
5557

5658
var textView: some View {

SwiftUI-WorkoutApp/Screens/Events/EventDetailsScreen.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,12 +227,12 @@ private extension EventDetailsScreen {
227227
)
228228
)
229229
)
230-
.disabled(!isNetworkConnected)
231230
}
232231
}
233232
}
234233

235234
func changeTrainHereStatus(newValue: Bool) {
235+
guard !SWAlert.shared.presentNoConnection(isNetworkConnected) else { return }
236236
let oldValue = event.trainHere
237237
switch (oldValue, newValue) {
238238
case (true, true), (false, false):
@@ -279,11 +279,7 @@ private extension EventDetailsScreen {
279279
)
280280
)
281281
}
282-
.disabled(
283-
!defaults.isAuthorized
284-
|| isEventAuthor
285-
|| !isNetworkConnected
286-
)
282+
.disabled(!defaults.isAuthorized || isEventAuthor)
287283
}
288284
}
289285
}
@@ -393,6 +389,7 @@ private extension EventDetailsScreen {
393389
}
394390

395391
func deletePhoto(id: Int) {
392+
guard !SWAlert.shared.presentNoConnection(isNetworkConnected) else { return }
396393
isLoading = true
397394
deletePhotoTask = Task {
398395
do {

0 commit comments

Comments
 (0)