Skip to content

Commit 8c0331b

Browse files
committed
2 parents a8e6dba + 5010419 commit 8c0331b

9 files changed

Lines changed: 439 additions & 80 deletions

File tree

apps/console/src/App.tsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ import { SiteHeader } from "@/components/site-header"
77
import { SidebarProvider } from "@/components/ui/sidebar"
88
import { DeveloperOverview } from './components/DeveloperOverview';
99
import { ObjectExplorer } from './components/ObjectExplorer';
10+
import { MetadataInspector } from './components/MetadataInspector';
1011
import { PackageManager } from './components/PackageManager';
1112
import { Toaster } from "@/components/ui/toaster"
1213
import { getApiBaseUrl, config } from './lib/config';
1314
import type { InstalledPackage } from '@objectstack/spec/kernel';
1415

15-
type ViewType = 'overview' | 'packages' | 'object';
16+
type ViewType = 'overview' | 'packages' | 'object' | 'metadata';
1617

1718
export default function App() {
1819
const [client, setClient] = useState<ObjectStackClient | null>(null);
1920
const [packages, setPackages] = useState<InstalledPackage[]>([]);
2021
const [selectedPackage, setSelectedPackage] = useState<InstalledPackage | null>(null);
2122
const [selectedObject, setSelectedObject] = useState<string | null>(null);
23+
const [selectedMeta, setSelectedMeta] = useState<{ type: string; name: string } | null>(null);
2224
const [selectedView, setSelectedView] = useState<ViewType>('overview');
2325

2426
// 1. Create client once
@@ -70,14 +72,28 @@ export default function App() {
7072
const handleSelectView = useCallback((view: ViewType) => {
7173
setSelectedView(view);
7274
setSelectedObject(null);
75+
setSelectedMeta(null);
76+
}, []);
77+
78+
const handleSelectMeta = useCallback((type: string, name: string) => {
79+
setSelectedMeta({ type, name });
80+
setSelectedObject(null);
81+
setSelectedView('metadata');
7382
}, []);
7483

7584
const handleNavigate = useCallback((view: string, detail?: string) => {
7685
if (view === 'packages') handleSelectView('packages');
7786
else if (detail) handleSelectObject(detail);
7887
}, [handleSelectView, handleSelectObject]);
7988

80-
if (!client) return null;
89+
if (!client) return (
90+
<div className="flex min-h-screen items-center justify-center bg-background">
91+
<div className="text-center space-y-2">
92+
<div className="h-8 w-8 mx-auto animate-spin rounded-full border-4 border-muted border-t-primary" />
93+
<p className="text-sm text-muted-foreground">Connecting to ObjectStack…</p>
94+
</div>
95+
</div>
96+
);
8197

8298
return (
8399
<ObjectStackProvider client={client}>
@@ -86,6 +102,8 @@ export default function App() {
86102
<AppSidebar
87103
selectedObject={selectedObject}
88104
onSelectObject={handleSelectObject}
105+
selectedMeta={selectedMeta}
106+
onSelectMeta={handleSelectMeta}
89107
packages={packages}
90108
selectedPackage={selectedPackage}
91109
onSelectPackage={handleSelectPackage}
@@ -95,12 +113,17 @@ export default function App() {
95113
<main className="flex min-w-0 flex-1 flex-col bg-background">
96114
<SiteHeader
97115
selectedObject={selectedObject}
116+
selectedMeta={selectedMeta}
98117
selectedView={selectedView}
99118
packageLabel={selectedPackage?.manifest?.name || selectedPackage?.manifest?.id}
100119
/>
101120
<div className="flex flex-1 flex-col overflow-hidden">
102121
{selectedView === 'object' && selectedObject ? (
103122
<ObjectExplorer objectApiName={selectedObject} />
123+
) : selectedView === 'metadata' && selectedMeta ? (
124+
<div className="flex-1 overflow-auto p-4">
125+
<MetadataInspector metaType={selectedMeta.type} metaName={selectedMeta.name} />
126+
</div>
104127
) : selectedView === 'packages' ? (
105128
<PackageManager />
106129
) : (

0 commit comments

Comments
 (0)