feat: streamline opencode loading screens and reuse the reload flow for vscode Restart API
Loading screens: drop the internal-jargon progress text on the opencode reload overlay (ConfigUpdateOverlay) and the vscode init splash — show text only on errors. Replace it with a glow pulse on the OpenCode mark on the cube's top face; OpenChamberLogo's isAnimated prop was a no-op and now actually animates. vscode shows the glow on the inline splash logo and the React app stops writing 'Loading data (… Providers, … Agents)…'. Restart API: 'OpenChamber: Restart API Connection' now runs the same full reload flow used after an OpenCode update — the command asks the chat webview to call reloadOpenCodeConfiguration() (overlay + managed restart via the bridge + config/data refresh) instead of a bare manager restart, falling back to the old restart when no webview is open. Mounts ConfigUpdateOverlay in the vscode app so the overlay actually shows there.
This commit is contained in:
@@ -5,6 +5,7 @@ import { RuntimeAPIProvider } from '@/contexts/RuntimeAPIProvider';
|
||||
import { registerRuntimeAPIs } from '@/contexts/runtimeAPIRegistry';
|
||||
import { TooltipProvider } from '@/components/ui/tooltip';
|
||||
import { Toaster } from '@/components/ui/sonner';
|
||||
import { ConfigUpdateOverlay } from '@/components/ui/ConfigUpdateOverlay';
|
||||
import { ErrorBoundary } from '@/components/ui/ErrorBoundary';
|
||||
import { VSCodeLayout } from '@/components/layout/VSCodeLayout';
|
||||
import { usePushVisibilityBeacon } from '@/hooks/usePushVisibilityBeacon';
|
||||
@@ -124,6 +125,7 @@ export function VSCodeApp({ apis }: VSCodeAppProps) {
|
||||
<SyncAppEffects embeddedBackgroundWorkEnabled={true} />
|
||||
<VSCodeLayout />
|
||||
<Toaster />
|
||||
<ConfigUpdateOverlay />
|
||||
</div>
|
||||
</TooltipProvider>
|
||||
</FireworksProvider>
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
import { OpenChamberLogo } from "./OpenChamberLogo";
|
||||
|
||||
export const ConfigUpdateOverlay: React.FC = () => {
|
||||
const [{ isUpdating, message }, setState] = React.useState(() => getConfigUpdateSnapshot());
|
||||
const [{ isUpdating }, setState] = React.useState(() => getConfigUpdateSnapshot());
|
||||
|
||||
React.useEffect(() => {
|
||||
return subscribeConfigUpdate(setState);
|
||||
@@ -16,12 +16,11 @@ export const ConfigUpdateOverlay: React.FC = () => {
|
||||
return null;
|
||||
}
|
||||
|
||||
// No status text — the update message is internal jargon and reads as noise.
|
||||
// The animated logo alone signals "working".
|
||||
return (
|
||||
<div className="fixed inset-0 z-[9999] flex flex-col items-center justify-center gap-6 bg-background/90">
|
||||
<OpenChamberLogo width={80} height={80} />
|
||||
<p className="typography-body text-muted-foreground">
|
||||
{message}
|
||||
</p>
|
||||
<div className="fixed inset-0 z-[9999] flex items-center justify-center bg-background/90">
|
||||
<OpenChamberLogo width={80} height={80} isAnimated />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -82,6 +82,7 @@ export const OpenChamberLogo: React.FC<OpenChamberLogoProps> = ({
|
||||
className = '',
|
||||
width = 70,
|
||||
height = 70,
|
||||
isAnimated = false,
|
||||
}) => {
|
||||
const { t } = useI18n();
|
||||
const themeContext = useOptionalThemeSystem();
|
||||
@@ -193,6 +194,9 @@ export const OpenChamberLogo: React.FC<OpenChamberLogoProps> = ({
|
||||
role="img"
|
||||
aria-label={t('openChamberLogo.aria.logo')}
|
||||
>
|
||||
{isAnimated ? (
|
||||
<style>{`@keyframes oc-logo-glow{0%,100%{filter:drop-shadow(0 0 0 transparent)}50%{filter:drop-shadow(0 0 4px var(--oc-glow-color))}}.oc-logo-glow{animation:oc-logo-glow 1.8s ease-in-out infinite}@media (prefers-reduced-motion:reduce){.oc-logo-glow{animation:none}}`}</style>
|
||||
) : null}
|
||||
{/* Left face - base fill */}
|
||||
<path
|
||||
d={`M${center.x} ${center.y} L${left.x} ${left.y} L${bottomLeft.x} ${bottomLeft.y} L${bottom.x} ${bottom.y} Z`}
|
||||
@@ -241,8 +245,12 @@ export const OpenChamberLogo: React.FC<OpenChamberLogoProps> = ({
|
||||
/>
|
||||
|
||||
{/* OpenCode logo on top face */}
|
||||
<g opacity={1}>
|
||||
{/*
|
||||
<g
|
||||
opacity={1}
|
||||
className={isAnimated ? 'oc-logo-glow' : undefined}
|
||||
style={isAnimated ? ({ '--oc-glow-color': strokeColor } as React.CSSProperties) : undefined}
|
||||
>
|
||||
{/*
|
||||
Isometric transform for top face:
|
||||
OpenCode logo (32x40 viewBox) centered and projected to isometric plane
|
||||
*/}
|
||||
|
||||
Reference in New Issue
Block a user