fix: Align subscription status mapping with tRPC state machine
tRPC subscriptions use connecting/pending/error/idle — not success. The old code mapped pending→isConnecting and waited for success (which never fires), causing AgentOutputViewer to permanently show "Connecting...". Now: connecting→isConnecting, pending→isConnected, idle→disconnected.
This commit is contained in:
@@ -106,11 +106,23 @@ export function useSubscriptionWithErrorHandling(
|
||||
return;
|
||||
}
|
||||
|
||||
if (subscriptionResult.status === 'pending') {
|
||||
if (subscriptionResult.status === 'connecting') {
|
||||
setState(prev => {
|
||||
if (prev.isConnecting && prev.error === null) return prev;
|
||||
return { ...prev, isConnecting: true, error: null };
|
||||
if (prev.isConnecting && !prev.isConnected && prev.error === null) return prev;
|
||||
return { ...prev, isConnecting: true, isConnected: false, error: null };
|
||||
});
|
||||
} else if (subscriptionResult.status === 'pending') {
|
||||
reconnectAttemptsRef.current = 0;
|
||||
setState(prev => {
|
||||
if (prev.isConnected && !prev.isConnecting && prev.error === null && prev.reconnectAttempts === 0) return prev;
|
||||
return { ...prev, isConnected: true, isConnecting: false, error: null, reconnectAttempts: 0 };
|
||||
});
|
||||
|
||||
if (reconnectTimeoutRef.current) {
|
||||
clearTimeout(reconnectTimeoutRef.current);
|
||||
reconnectTimeoutRef.current = null;
|
||||
}
|
||||
|
||||
callbacksRef.current.onStarted?.();
|
||||
} else if (subscriptionResult.status === 'error') {
|
||||
const error = subscriptionResult.error instanceof Error
|
||||
@@ -126,17 +138,12 @@ export function useSubscriptionWithErrorHandling(
|
||||
|
||||
callbacksRef.current.onError?.(error);
|
||||
scheduleReconnect();
|
||||
} else if (subscriptionResult.status === 'success') {
|
||||
reconnectAttemptsRef.current = 0;
|
||||
} else if (subscriptionResult.status === 'idle') {
|
||||
setState(prev => {
|
||||
if (prev.isConnected && !prev.isConnecting && prev.error === null && prev.reconnectAttempts === 0) return prev;
|
||||
return { ...prev, isConnected: true, isConnecting: false, error: null, reconnectAttempts: 0 };
|
||||
if (!prev.isConnected && !prev.isConnecting && prev.error === null) return prev;
|
||||
return { ...prev, isConnected: false, isConnecting: false, error: null };
|
||||
});
|
||||
|
||||
if (reconnectTimeoutRef.current) {
|
||||
clearTimeout(reconnectTimeoutRef.current);
|
||||
reconnectTimeoutRef.current = null;
|
||||
}
|
||||
callbacksRef.current.onStopped?.();
|
||||
}
|
||||
}, [enabled, subscriptionResult.status, subscriptionResult.error, scheduleReconnect]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user