Shivam311's picture
feat: CodeAtlas Enterprise - IBM Bob Engineering Intelligence Platform
3a7842d
Raw
History Blame Contribute Delete
1.98 kB
import { Navigate } from 'react-router-dom';
import { useEffect, useState } from 'react';
import { Loader2 } from 'lucide-react';
import Sidebar from './Sidebar';
import TopBar from './TopBar';
import { getRepoStatus } from '../../api/client';
import { useRepoStore } from '../../store/useRepoStore';
export default function PageWrapper({ title, subtitle, children, requireRepo = true, action }) {
const { repoId, resetAll } = useRepoStore();
const [checkingRepo, setCheckingRepo] = useState(Boolean(requireRepo && repoId));
useEffect(() => {
if (!requireRepo || !repoId) {
setCheckingRepo(false);
return undefined;
}
let cancelled = false;
setCheckingRepo(true);
getRepoStatus(repoId)
.catch((error) => {
if (!cancelled && error?.response?.status === 404) {
resetAll();
}
})
.finally(() => {
if (!cancelled) setCheckingRepo(false);
});
return () => {
cancelled = true;
};
}, [repoId, requireRepo, resetAll]);
if (requireRepo && !repoId) {
return <Navigate to="/ingest" replace />;
}
if (checkingRepo) {
return (
<div className="min-h-screen">
<Sidebar />
<main className="min-h-screen px-4 py-6 lg:ml-64 lg:px-8">
<TopBar title={title} subtitle={subtitle} action={action} />
<div className="flex min-h-[60vh] items-center justify-center">
<div className="flex items-center gap-3 rounded-lg border border-cyan-400/20 bg-cyan-500/10 px-4 py-3 text-sm text-cyan-100">
<Loader2 className="h-4 w-4 animate-spin" />
Checking repository session
</div>
</div>
</main>
</div>
);
}
return (
<div className="min-h-screen">
<Sidebar />
<main className="min-h-screen px-4 py-6 lg:ml-64 lg:px-8">
<TopBar title={title} subtitle={subtitle} action={action} />
{children}
</main>
</div>
);
}