From 98e2a1d3f1acdd46d34f4e66930cb29e0927fc93 Mon Sep 17 00:00:00 2001 From: sbilketay Date: Wed, 11 Feb 2026 22:22:20 +0300 Subject: [PATCH] =?UTF-8?q?fix(ios):=20iptal=20edilen=20isteklerde=20hata?= =?UTF-8?q?=20g=C3=B6sterimini=20d=C3=BCzelt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - API uç noktasını yeni IP adresine güncelle - Docker yapılandırmasında node_modules için adlandırılmış volume ekle - Arama işlemlerinde iptal durumlarını yoksay ve hata mesajı gösterme - NetworkErrorView'da wifi ikonunu kaldır --- docker-compose.yml | 4 +++- .../UserInterfaceState.xcuserstate | Bin 0 -> 15896 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++++++++++ .../Components/NetworkErrorView.swift | 2 -- ios/Bookibra/Resources/Debug.xcconfig | 2 +- ios/Bookibra/Resources/Info.plist | 2 +- ios/Bookibra/Resources/Release.xcconfig | 2 +- ios/Bookibra/Services/APIClient.swift | 4 ++-- .../ViewModels/AddBooksViewModel.swift | 17 +++++++++++++++++ 9 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 ios/Bookibra.xcodeproj/project.xcworkspace/xcuserdata/wisecolt-macbook.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ios/Bookibra.xcodeproj/xcuserdata/wisecolt-macbook.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/docker-compose.yml b/docker-compose.yml index 862b517..58d9773 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,7 +28,8 @@ services: condition: service_healthy volumes: - ./:/app - command: npm run dev + - api-node_modules:/app/node_modules + command: sh -c "npm install && npm run dev" redis: image: redis:7-alpine @@ -63,3 +64,4 @@ services: volumes: postgres-data: frontend-node_modules: + api-node_modules: diff --git a/ios/Bookibra.xcodeproj/project.xcworkspace/xcuserdata/wisecolt-macbook.xcuserdatad/UserInterfaceState.xcuserstate b/ios/Bookibra.xcodeproj/project.xcworkspace/xcuserdata/wisecolt-macbook.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b042412559cfef126ca900428dbf948e14c8a07f GIT binary patch literal 15896 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 + + + + SchemeUserState + + Bookibra.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/ios/Bookibra/DesignSystem/Components/NetworkErrorView.swift b/ios/Bookibra/DesignSystem/Components/NetworkErrorView.swift index b496cbb..af0b7b0 100644 --- a/ios/Bookibra/DesignSystem/Components/NetworkErrorView.swift +++ b/ios/Bookibra/DesignSystem/Components/NetworkErrorView.swift @@ -6,8 +6,6 @@ struct NetworkErrorView: View { var body: some View { VStack(spacing: 12) { - Image(systemName: "wifi.exclamationmark") - .font(.title2) Text(message) .font(.subheadline) .multilineTextAlignment(.center) diff --git a/ios/Bookibra/Resources/Debug.xcconfig b/ios/Bookibra/Resources/Debug.xcconfig index d8e5cff..734797c 100644 --- a/ios/Bookibra/Resources/Debug.xcconfig +++ b/ios/Bookibra/Resources/Debug.xcconfig @@ -1 +1 @@ -API_BASE_URL = http://192.168.1.124:8080 +API_BASE_URL = http://192.168.1.141:8080 diff --git a/ios/Bookibra/Resources/Info.plist b/ios/Bookibra/Resources/Info.plist index b75bd79..b6ec619 100644 --- a/ios/Bookibra/Resources/Info.plist +++ b/ios/Bookibra/Resources/Info.plist @@ -39,7 +39,7 @@ API_BASE_URL - http://192.168.1.124:8080 + http://192.168.1.141:8080 NSCameraUsageDescription ISBN barkodu taramak için kameraya erişim gerekiyor. diff --git a/ios/Bookibra/Resources/Release.xcconfig b/ios/Bookibra/Resources/Release.xcconfig index 3dbde3d..734797c 100644 --- a/ios/Bookibra/Resources/Release.xcconfig +++ b/ios/Bookibra/Resources/Release.xcconfig @@ -1 +1 @@ -API_BASE_URL = http://localhost:8080 +API_BASE_URL = http://192.168.1.141:8080 diff --git a/ios/Bookibra/Services/APIClient.swift b/ios/Bookibra/Services/APIClient.swift index 2836f55..708356b 100644 --- a/ios/Bookibra/Services/APIClient.swift +++ b/ios/Bookibra/Services/APIClient.swift @@ -108,7 +108,7 @@ extension Bundle { return url } - // 2) If scheme is missing (e.g. "192.168.1.124:8080"), prepend http://. + // 2) If scheme is missing (e.g. "192.168.1.141:8080"), prepend http://. if !raw.isEmpty, !raw.contains("://"), let url = URL(string: "http://\(raw)"), let host = url.host, !host.isEmpty { @@ -116,7 +116,7 @@ extension Bundle { } // 3) Device-local fallback for current dev network. - if let fallback = URL(string: "http://192.168.1.124:8080") { + if let fallback = URL(string: "http://192.168.1.141:8080") { #if DEBUG print("[API] Invalid API_BASE_URL='\(raw)'. Falling back to \(fallback.absoluteString)") #endif diff --git a/ios/Bookibra/ViewModels/AddBooksViewModel.swift b/ios/Bookibra/ViewModels/AddBooksViewModel.swift index 45b668c..56d1673 100644 --- a/ios/Bookibra/ViewModels/AddBooksViewModel.swift +++ b/ios/Bookibra/ViewModels/AddBooksViewModel.swift @@ -56,6 +56,7 @@ final class AddBooksViewModel: ObservableObject { results = try await booksService.searchByTitle(value, locales: "tr,en") errorMessage = nil } catch { + guard !isIgnorable(error) else { return } errorMessage = error.localizedDescription } } @@ -69,6 +70,7 @@ final class AddBooksViewModel: ObservableObject { results = try await booksService.searchByISBN(isbn, locales: "tr,en") errorMessage = nil } catch { + guard !isIgnorable(error) else { return } errorMessage = error.localizedDescription } } @@ -82,7 +84,22 @@ final class AddBooksViewModel: ObservableObject { results = try await booksService.filter(title: filterTitle, year: filterYear, locales: "tr,en") errorMessage = nil } catch { + guard !isIgnorable(error) else { return } errorMessage = error.localizedDescription } } + + private func isIgnorable(_ error: Error) -> Bool { + if error is CancellationError { + return true + } + + let nsError = error as NSError + if nsError.domain == NSURLErrorDomain, nsError.code == NSURLErrorCancelled { + return true + } + + let message = error.localizedDescription.lowercased() + return message.contains("cancelled") || message.contains("vazgeç") + } }