import { useCallback } from 'react'; const useTenantManager = ({ apiClient, appDispatch, currentTenantId, resetWorkspaceState, setStatusMessage, notifyApiError, setLoading, refreshTags, refreshCorrespondents, loadFolder, handleDocumentsViewModeChange, navigate, tokenRef, tenantIdRef, }) => { const handleTenantSelect = useCallback( async (tenantOption, { refreshOnly = false } = {}) => { const requestedTenantId = tenantOption?.id ?? null; if (!refreshOnly && (!requestedTenantId || requestedTenantId === currentTenantId)) { return; } setLoading(true); try { if (!refreshOnly) { setStatusMessage('Switching tenant…', 'info'); } if (refreshOnly) { const { data } = await apiClient.get('/auth/tenants'); appDispatch({ type: 'SET_TENANTS', tenants: Array.isArray(data?.tenants) ? data.tenants : [], }); return; } const { data } = await apiClient.post('/auth/select-tenant', { tenant_id: requestedTenantId, }); if (!data?.access_token) { throw new Error('Missing access token in tenant switch response.'); } appDispatch({ type: 'LOGOUT' }); resetWorkspaceState(); appDispatch({ type: 'LOGIN_SUCCESS', token: data.access_token, tenant: data.tenant || null, }); apiClient.defaults.headers.common.Authorization = `Bearer ${data.access_token}`; if (tokenRef) { tokenRef.current = data.access_token; } if (tenantIdRef) { tenantIdRef.current = data?.tenant?.id ?? null; } if (Array.isArray(data?.tenants)) { appDispatch({ type: 'SET_TENANTS', tenants: data.tenants }); } handleDocumentsViewModeChange('list'); navigate('/documents', { replace: true }); await Promise.all([refreshTags(), refreshCorrespondents()]); await loadFolder('root', { showLoading: false, preserveSearch: false }); const tenantLabel = data?.tenant?.name || data?.tenant?.id || 'tenant'; setStatusMessage(`Switched to ${tenantLabel}.`, 'info'); } catch (error) { notifyApiError(error, 'Failed to switch tenant.'); } finally { setLoading(false); } }, [ apiClient, appDispatch, currentTenantId, handleDocumentsViewModeChange, loadFolder, navigate, notifyApiError, refreshCorrespondents, refreshTags, resetWorkspaceState, setLoading, setStatusMessage, tenantIdRef, tokenRef, ], ); return { handleTenantSelect }; }; export default useTenantManager;