feature/app-selector

This commit is contained in:
2026-05-26 16:59:32 -06:00
parent 904fa965c8
commit dbf68986da
34 changed files with 792 additions and 169 deletions

View File

@@ -81,16 +81,18 @@ export function clearAuthTokens(cookies: Cookies) {
cookies.delete('refresh_token', { path: '/' });
cookies.delete('id_token', { path: '/' });
cookies.delete('active_company_id', { path: '/' });
cookies.delete('active_system', { path: '/' });
}
/**
* Crea headers de autorización con el token Bearer
*/
export function createAuthHeaders(token: string, additionalHeaders?: Record<string, string>, tenantOverride?: string) {
export function createAuthHeaders(token: string, additionalHeaders?: Record<string, string>, tenantOverride?: string, activeSystem?: string) {
return {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
...(tenantOverride ? { 'X-Tenant-Override': tenantOverride } : {}),
...(activeSystem ? { 'X-Active-System': activeSystem } : {}),
...additionalHeaders
};
}
@@ -169,6 +171,8 @@ export async function authenticatedFetch(
// Leer tenant override de cookie SSO (flujo multi-tenant relay)
const tenantOverride = cookies.get('sso_tenant_id');
// Sistema activo (SCAF/SCAII) para reenviar al backend vía header
const activeSystem = cookies.get('active_system');
// Crear AbortController para timeout
const controller = new AbortController();
@@ -181,8 +185,12 @@ export async function authenticatedFetch(
// Si el body es FormData, no incluir Content-Type (el navegador lo establece con el boundary)
const isFormData = options.body instanceof FormData;
const headers = isFormData
? { 'Authorization': `Bearer ${accessToken}`, ...(options.headers as Record<string, string> || {}) }
: createAuthHeaders(accessToken, options.headers as Record<string, string>, tenantOverride);
? {
'Authorization': `Bearer ${accessToken}`,
...(activeSystem ? { 'X-Active-System': activeSystem } : {}),
...(options.headers as Record<string, string> || {})
}
: createAuthHeaders(accessToken, options.headers as Record<string, string>, tenantOverride, activeSystem);
let response = await fetch(url, {
...options,
@@ -212,8 +220,12 @@ export async function authenticatedFetch(
// Si el body es FormData, no incluir Content-Type
const newHeaders = isFormData
? { 'Authorization': `Bearer ${newToken}`, ...(options.headers as Record<string, string> || {}) }
: createAuthHeaders(newToken, options.headers as Record<string, string>, tenantOverride);
? {
'Authorization': `Bearer ${newToken}`,
...(activeSystem ? { 'X-Active-System': activeSystem } : {}),
...(options.headers as Record<string, string> || {})
}
: createAuthHeaders(newToken, options.headers as Record<string, string>, tenantOverride, activeSystem);
response = await fetch(url, {
...options,