You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HMG_QLine/HUB_STATUS_BUG_FIX.md

6.9 KiB

Bug Fix - Hub Status Showing "Connected" When Connection Fails

🐛 Bug Reported

Issue: "If it's unable to connect to SignalR, why does it say hub status connected?"

What was happening: Even when SignalR failed to connect (due to CORS or any other error), the UI footer was showing:

Hub Status: Connected ✅

This was misleading and made debugging difficult.


🔍 Root Cause Analysis

Problem 1: Initial State Was true

File: /lib/view_models/screen_config_view_model.dart (Line 207)

bool isHubConnected = true;  // ❌ Wrong! Started as true by default

The hub status was initialized to true even before attempting to connect.

Problem 2: Connection Result Not Used

File: /lib/view_models/queuing_view_model.dart (Line 45-60)

Future<bool?> startHubConnection() async {
  return await signalrRepo.startHubConnection(...); // ❌ Returned but not used to update status
}

When startHubConnection() returned false (connection failed), the status wasn't being updated.

Problem 3: No Initial Status Reset

File: /lib/view_models/queuing_view_model.dart (Line 35-43)

Future<void> initializeQueueingVM() async {
  await startHubConnection(); // ❌ No initial status set
  // ...
}

The initialization didn't explicitly set the status to disconnected before attempting to connect.


✅ Fixes Applied

Fix 1: Changed Initial State to false

File: /lib/view_models/screen_config_view_model.dart

bool isHubConnected = false; // ✅ Start as disconnected until connection succeeds

Why: The app should assume disconnected until proven connected.

Fix 2: Update Status Based on Connection Result

File: /lib/view_models/queuing_view_model.dart

Future<bool?> startHubConnection() async {
  try {
    ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>();
    final result = await signalrRepo.startHubConnection(...);
    
    // ✅ Update hub connection status based on result
    if (result == true) {
      screenConfigViewModel.updateIsHubConnected(true);
      loggerService.logToFile(message: "Hub connection successful", ...);
    } else {
      screenConfigViewModel.updateIsHubConnected(false);
      loggerService.logToFile(message: "Hub connection failed - result: $result", ...);
    }
    
    return result;
  } catch (e, st) {
    // ✅ On error, mark as disconnected
    ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>();
    screenConfigViewModel.updateIsHubConnected(false);
    // ...
  }
}

Why: The connection status should accurately reflect the result of the connection attempt.

Fix 3: Set Initial Status in Initialization

File: /lib/view_models/queuing_view_model.dart

Future<void> initializeQueueingVM() async {
  try {
    // ✅ Mark as disconnected initially
    ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>();
    screenConfigViewModel.updateIsHubConnected(false);
    
    // ✅ Attempt to connect (will update status based on result)
    await startHubConnection();
    // ...
  }
}

Why: Clear initialization prevents race conditions and ensures consistent state.


🎯 Expected Behavior After Fix

Scenario 1: Successful Connection (Mobile)

1. App starts
   → Hub Status: Disconnected ❌
2. Attempting SignalR connection...
   → Hub Status: Disconnected ❌
3. Connection successful!
   → Hub Status: Connected ✅

Scenario 2: Failed Connection (Web - CORS)

1. App starts
   → Hub Status: Disconnected ❌
2. Attempting SignalR connection...
   → Hub Status: Disconnected ❌
3. Connection fails (CORS error)
   → Hub Status: Disconnected ❌  ← Stays disconnected!

Scenario 3: Connection Lost

1. Connected and running
   → Hub Status: Connected ✅
2. Network issue / Server restart
   → onHubDisconnected() called
   → Hub Status: Disconnected ❌
3. Auto-reconnect attempts...
   → Hub Status: Disconnected ❌
4. Reconnection successful
   → onHubReconnected() called
   → Hub Status: Connected ✅

🧪 How to Test

Test 1: Web (CORS Blocked)

  1. Open web app
  2. Check footer: Should show "Hub Status: Disconnected" ❌
  3. Check logs: Should show "Hub connection failed"

Test 2: Mobile (Working)

  1. Open mobile app
  2. Wait for connection
  3. Check footer: Should show "Hub Status: Connected" ✅
  4. Check logs: Should show "Hub connection successful"

Test 3: Connection Loss

  1. Start mobile app (connected)
  2. Turn off network
  3. Check footer: Should change to "Disconnected" ❌
  4. Turn on network
  5. Check footer: Should change back to "Connected" ✅

📊 Status Flow Diagram

Before Fix:

App Start → isHubConnected = true ✅ (WRONG!)
          → Attempt connection
          → Connection fails
          → isHubConnected = true ✅ (Still shows connected!)

After Fix:

App Start → isHubConnected = false ❌
          → Attempt connection
          → Connection fails
          → Update status: false ❌ (Correctly shows disconnected!)
App Start → isHubConnected = false ❌
          → Attempt connection
          → Connection succeeds
          → Update status: true ✅ (Correctly shows connected!)

📝 Code Changes Summary

File Lines Changed Description
screen_config_view_model.dart 207 Changed isHubConnected initial value from true to false
queuing_view_model.dart 35-43 Added initial status reset in initializeQueueingVM()
queuing_view_model.dart 45-82 Updated startHubConnection() to set status based on result

🎯 Impact

User Experience

  • ✅ More accurate status display: Users see the real connection state
  • ✅ Better troubleshooting: Clear indication when connection fails
  • ✅ No false positives: Won't show "Connected" when it's actually disconnected

Developer Experience

  • ✅ Easier debugging: Logs now show accurate connection status
  • ✅ Clear state management: Status updates are explicit and traceable
  • ✅ Consistent behavior: All connection paths update status correctly

Web Platform

  • ✅ CORS errors visible: Footer now correctly shows "Disconnected" when CORS blocks connection
  • ✅ Clear user feedback: Users can see that connection failed
  • ✅ Better error reporting: Status matches logs and actual state

✅ Verification Checklist

  • Initial state is false (disconnected)
  • Status updates to true on successful connection
  • Status updates to false on failed connection
  • Status updates to false on connection error
  • Logging added for status changes
  • No compiler errors
  • Existing functionality preserved

Date: August 2, 2026
Status: ✅ FIXED
Files Modified: 2
Impact: High (affects all platforms)