From bab0b1810f750dc3789a48f83b2350e9497f803c Mon Sep 17 00:00:00 2001 From: Rob Colbert Date: Sun, 3 May 2026 04:15:48 -0400 Subject: [PATCH] many fixes - JWT refresh logic to prevent dead sessions - drone status messages now arrive in IDE for display - WorkspaceService.deployProject method added to clone into a repo or create the directory (new project not yet in git) --- gadget-code/frontend/src/App.tsx | 2 +- .../frontend/src/components/StatusBar.tsx | 23 +++++- gadget-code/frontend/src/lib/api.ts | 79 +++++++++++++++++++ .../frontend/src/pages/ChatSessionView.tsx | 10 ++- gadget-code/src/controllers/api/v1/auth.ts | 16 ++-- gadget-drone/src/services/workspace.ts | 28 ++++++- 6 files changed, 147 insertions(+), 11 deletions(-) diff --git a/gadget-code/frontend/src/App.tsx b/gadget-code/frontend/src/App.tsx index 113e9ab..cd32c76 100644 --- a/gadget-code/frontend/src/App.tsx +++ b/gadget-code/frontend/src/App.tsx @@ -51,7 +51,7 @@ interface AppContextType { onSignOut: () => void; } -const AppContext = createContext(null); +export const AppContext = createContext(null); export function useAppContext(): AppContextType { const ctx = useContext(AppContext); diff --git a/gadget-code/frontend/src/components/StatusBar.tsx b/gadget-code/frontend/src/components/StatusBar.tsx index 86442ed..183fe88 100644 --- a/gadget-code/frontend/src/components/StatusBar.tsx +++ b/gadget-code/frontend/src/components/StatusBar.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useRef } from 'react'; import { socketClient } from '../lib/socket'; export type ConnectionStatus = 'connected' | 'connecting' | 'error' | 'disconnected'; @@ -33,6 +33,25 @@ function ConnectionIndicator({ status }: { status: ConnectionStatus }) { export default function StatusBar({ statusMessage = 'Ready.', projectSlug, sessionMode }: StatusBarProps) { const [connectionStatus, setConnectionStatus] = useState('disconnected'); + const [displayMessage, setDisplayMessage] = useState(statusMessage); + const clearTimerRef = useRef | null>(null); + + useEffect(() => { + if (clearTimerRef.current) { + clearTimeout(clearTimerRef.current); + } + + setDisplayMessage(statusMessage); + clearTimerRef.current = setTimeout(() => { + setDisplayMessage(''); + }, 10000); + + return () => { + if (clearTimerRef.current) { + clearTimeout(clearTimerRef.current); + } + }; + }, [statusMessage]); useEffect(() => { const updateStatus = () => { @@ -59,7 +78,7 @@ export default function StatusBar({ statusMessage = 'Ready.', projectSlug, sessi return (