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.
248 lines
6.9 KiB
Markdown
248 lines
6.9 KiB
Markdown
# 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)
|
|
|
|
```dart
|
|
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)
|
|
|
|
```dart
|
|
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)
|
|
|
|
```dart
|
|
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`
|
|
|
|
```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`
|
|
|
|
```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`
|
|
|
|
```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
|
|
|
|
- [x] Initial state is `false` (disconnected)
|
|
- [x] Status updates to `true` on successful connection
|
|
- [x] Status updates to `false` on failed connection
|
|
- [x] Status updates to `false` on connection error
|
|
- [x] Logging added for status changes
|
|
- [x] No compiler errors
|
|
- [x] Existing functionality preserved
|
|
|
|
---
|
|
|
|
**Date:** August 2, 2026
|
|
**Status:** ✅ FIXED
|
|
**Files Modified:** 2
|
|
**Impact:** High (affects all platforms)
|
|
|