105 lines
2.7 KiB
JavaScript
105 lines
2.7 KiB
JavaScript
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;
|