From cc32d7acad64a79abcbf8c53cb5a7a0b669f2f01 Mon Sep 17 00:00:00 2001 From: cheykrym Date: Tue, 21 Oct 2025 19:12:25 +0300 Subject: [PATCH] fix reconnect socket --- yobble/Components/TopBarView.swift | 4 ++-- yobble/Services/SocketService.swift | 28 ++++++++++++++++++++++++++++ yobble/Views/Tab/ChatsTab.swift | 10 +++++----- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/yobble/Components/TopBarView.swift b/yobble/Components/TopBarView.swift index fee3fba..35e96fa 100644 --- a/yobble/Components/TopBarView.swift +++ b/yobble/Components/TopBarView.swift @@ -30,8 +30,8 @@ struct TopBarView: View { private var statusMessage: String? { if viewModel.chatLoadingState == .loading { return NSLocalizedString("Загрузка чатов", comment: "") - } else - if viewModel.socketState != .connected { + } + if viewModel.socketState == .connecting { return NSLocalizedString("Подключение", comment: "") } return nil diff --git a/yobble/Services/SocketService.swift b/yobble/Services/SocketService.swift index 9bb9db1..cd2eaf1 100644 --- a/yobble/Services/SocketService.swift +++ b/yobble/Services/SocketService.swift @@ -41,6 +41,7 @@ final class SocketService { private var heartbeatAckInFlight = false private var lastHeartbeatSentAt: Date? private var consecutiveHeartbeatMisses = 0 + private var reconnectWorkItem: DispatchWorkItem? #endif private init() {} @@ -126,6 +127,7 @@ final class SocketService { currentToken = token currentAuthPayload = ["token": token] setupSocket(with: token) + cancelScheduledReconnect() updateConnectionState(.connecting) socket?.connect(withPayload: currentAuthPayload) startHeartbeat() @@ -202,11 +204,13 @@ final class SocketService { socket.on(clientEvent: .disconnect) { data, _ in if AppConfig.DEBUG { print("[SocketService] Disconnected: \(data)") } self.updateConnectionState(.disconnected) + self.scheduleReconnect() } socket.on(clientEvent: .error) { data, _ in if AppConfig.DEBUG { print("[SocketService] Error: \(data)") } self.updateConnectionState(.disconnected) + self.scheduleReconnect() } socket.on("pong") { [weak self] _, _ in @@ -223,6 +227,7 @@ final class SocketService { private func disconnectInternal() { stopHeartbeat() + cancelScheduledReconnect() socket?.disconnect() manager?.disconnect() socket = nil @@ -321,6 +326,7 @@ final class SocketService { consecutiveHeartbeatMisses = 0 heartbeatAckInFlight = false lastHeartbeatSentAt = nil + cancelScheduledReconnect() updateConnectionState(.connected) } @@ -339,6 +345,28 @@ final class SocketService { socket.disconnect() socket.connect(withPayload: currentAuthPayload) } + + private func scheduleReconnect(after delay: TimeInterval = 5) { + cancelScheduledReconnect() + let workItem = DispatchWorkItem { [weak self] in + guard let self else { return } + if self.refreshAuthTokenIfNeeded(disconnectIfMissing: true) { return } + + if let socket = self.socket { + self.updateConnectionState(.connecting) + socket.connect(withPayload: self.currentAuthPayload) + } else { + self.connectForCurrentUser() + } + } + reconnectWorkItem = workItem + syncQueue.asyncAfter(deadline: .now() + delay, execute: workItem) + } + + private func cancelScheduledReconnect() { + reconnectWorkItem?.cancel() + reconnectWorkItem = nil + } #else private func disconnectInternal() { } #endif diff --git a/yobble/Views/Tab/ChatsTab.swift b/yobble/Views/Tab/ChatsTab.swift index 5b4d2f4..637ea7c 100644 --- a/yobble/Views/Tab/ChatsTab.swift +++ b/yobble/Views/Tab/ChatsTab.swift @@ -116,11 +116,11 @@ struct ChatsTab: View { Text(message) .font(.subheadline) .foregroundColor(.orange) - Spacer(minLength: 0) - Button(action: triggerChatsReload) { - Text(NSLocalizedString("Обновить", comment: "")) - .font(.subheadline) - } +// Spacer(minLength: 0) +// Button(action: triggerChatsReload) { +// Text(NSLocalizedString("Обновить", comment: "")) +// .font(.subheadline) +// } } .padding(.vertical, 4) }