import { useState, useEffect, useMemo } from 'react' import { fetchTenantsPaginated } from '@/api/tenant' import { Tenant, useTenantState } from '@/stores/tenant' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/Card' import Button from '@/components/ui/Button' import Input from '@/components/ui/Input' import { Loader2, Search, Building2, Clock, Database, FileText, HardDrive } from 'lucide-react' // Storage key for last selected tenant const LAST_TENANT_KEY = 'lightrag:lastSelectedTenant' interface TenantSelectionPageProps { onSelect: (tenant: Tenant) => void } export default function TenantSelectionPage({ onSelect }: TenantSelectionPageProps) { const [tenants, setTenants] = useState([]) const [loading, setLoading] = useState(true) const [search, setSearch] = useState('') const [page, setPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [error, setError] = useState(null) const setSelectedTenant = useTenantState.use.setSelectedTenant() // Track last selected tenant ID const [lastTenantId] = useState(() => { try { return sessionStorage.getItem(LAST_TENANT_KEY) } catch { return null } }) const loadTenants = async () => { setLoading(true) setError(null) try { const response = await fetchTenantsPaginated(page, 12, search) setTenants(response.items) setTotalPages(response.total_pages) } catch (err) { console.error('Failed to load tenants', err) setError('Failed to load tenants. Please try again.') } finally { setLoading(false) } } useEffect(() => { const timer = setTimeout(() => { loadTenants() }, 300) return () => clearTimeout(timer) }, [page, search]) const handleSelect = (tenant: Tenant) => { // Set in store (which handles localStorage) setSelectedTenant(tenant) // Save as last selected tenant for next time try { sessionStorage.setItem(LAST_TENANT_KEY, tenant.tenant_id) } catch (e) { console.warn('Failed to save last tenant', e) } onSelect(tenant) } // Sort tenants to show last selected first const sortedTenants = useMemo(() => { if (!lastTenantId) return tenants return [...tenants].sort((a, b) => { if (a.tenant_id === lastTenantId) return -1 if (b.tenant_id === lastTenantId) return 1 return 0 }) }, [tenants, lastTenantId]) // Check if a tenant was recently selected const isLastSelected = (tenantId: string) => tenantId === lastTenantId return (

Welcome to LightRAG

Select a tenant to continue to the dashboard

setSearch(e.target.value)} />
{error && (
{error}
)} {loading ? (
) : (
{sortedTenants.map((tenant) => ( handleSelect(tenant)} >
{tenant.name || tenant.tenant_name || tenant.tenant_id}
{isLastSelected(tenant.tenant_id) && ( Recently used )}
{tenant.description || 'No description available'}
{tenant.num_knowledge_bases || 0} KBs
{tenant.num_documents || 0} Docs
{tenant.storage_used_gb ? `${tenant.storage_used_gb.toFixed(1)}` : '0'} GB
))} {tenants.length === 0 && !loading && (
No tenants found matching your search.
)}
)} {totalPages > 1 && (
Page {page} of {totalPages}
)}
) }