fix reconnect socket
This commit is contained in:
		
							parent
							
								
									da5f198d8c
								
							
						
					
					
						commit
						cc32d7acad
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user