import { useCallback, useEffect, useState } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { AlertCircle, ArrowRight, Building2, Loader2 } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import langbotIcon from '@/app/assets/langbot-logo.webp'; import { bootstrapWorkspaceSession, clearUserInfo, selectWorkspace, useWorkspaceBootstrap, } from '@/app/infra/http'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { LanguageSelector } from '@/components/ui/language-selector'; import { ThemeToggle } from '@/components/ui/theme-toggle'; function safeReturnPath(value: string | null): string { if ( value && value.startsWith('/') && !value.startsWith('//') && (value === '/wizard' || value.startsWith('/home')) ) { return value; } return '/home'; } export default function WorkspaceSelectPage() { const { t } = useTranslation(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const workspaces = useWorkspaceBootstrap(); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); const [selectingUuid, setSelectingUuid] = useState(null); const returnTo = safeReturnPath(searchParams.get('returnTo')); const loadWorkspaces = useCallback(async () => { setLoading(true); setError(false); try { const result = await bootstrapWorkspaceSession({ requireExplicitSelection: true, }); if (result.status === 'ready') { navigate(returnTo, { replace: true }); } else if (result.status === 'unavailable') { setError(true); } } catch { setError(true); } finally { setLoading(false); } }, [navigate, returnTo]); useEffect(() => { void loadWorkspaces(); }, [loadWorkspaces]); async function handleSelect(workspaceUuid: string) { setSelectingUuid(workspaceUuid); setError(false); try { const result = await selectWorkspace(workspaceUuid); if (result.status === 'ready') { navigate(returnTo, { replace: true }); return; } setError(true); } catch { setError(true); } finally { setSelectingUuid(null); } } function handleLogout() { clearUserInfo(); localStorage.removeItem('token'); localStorage.removeItem('userEmail'); navigate('/login', { replace: true }); } return (
LangBot {t('workspace.selectTitle')} {t('workspace.selectDescription')}
{loading ? (
) : (
{error && (
{t('workspace.selectionLoadFailed')}
)} {workspaces.map((entry) => { const selecting = selectingUuid === entry.workspace.uuid; return ( ); })}
)}
); }