feat: persistir selección de compañía mediante cookies y SSR

This commit is contained in:
2026-04-24 10:28:52 -06:00
parent f7261c3b36
commit 882d754d33
3 changed files with 20 additions and 7 deletions

View File

@@ -35,7 +35,7 @@ class CompanyStore {
* Carga las compañías del tenant del usuario desde el backend
* @param preloadedCompanies - Compañías pre-cargadas desde el servidor (SSR)
*/
async loadCompanies(preloadedCompanies?: Company[]) {
async loadCompanies(preloadedCompanies?: Company[], activeCompanyId?: number) {
// Si tenemos compañías pre-cargadas, usarlas directamente
if (preloadedCompanies && preloadedCompanies.length > 0) {
// Detectar si el tenant ha cambiado
@@ -49,9 +49,18 @@ class CompanyStore {
this._currentTenantId = newTenantId;
this._companies = preloadedCompanies;
// Si hay compañías y no hay una activa, seleccionar la primera o la guardada
// Si hay compañías y no hay una activa, seleccionar la correcta
if (this._companies.length > 0 && !this._activeCompany) {
// Intentar restaurar la compañía guardada
// Prioridad 1: ID pasado por parámetro (desde SSR/Cookie)
if (activeCompanyId) {
const company = this._companies.find(c => c.id === activeCompanyId);
if (company) {
this.setActiveCompany(company, true);
return;
}
}
// Prioridad 2: Intentar restaurar de localStorage (Browser only)
if (typeof window !== 'undefined') {
const savedId = localStorage.getItem('activeCompanyId');
if (savedId) {
@@ -62,7 +71,7 @@ class CompanyStore {
}
}
}
// Si no hay guardada, seleccionar la primera
// Prioridad 3: Si no hay nada, seleccionar la primera
this.setActiveCompany(this._companies[0], true); // silent=true para inicialización
}
return;
@@ -219,8 +228,8 @@ class CompanyStore {
* Inicializa el store cargando las compañías
* @param preloadedCompanies - Compañías pre-cargadas desde el servidor (SSR)
*/
async initialize(preloadedCompanies?: Company[]) {
await this.loadCompanies(preloadedCompanies);
async initialize(preloadedCompanies?: Company[], activeCompanyId?: number) {
await this.loadCompanies(preloadedCompanies, activeCompanyId);
// Si no hay compañías pre-cargadas, intentar restaurar de localStorage
if (!preloadedCompanies) {
this.restoreActiveCompany();

View File

@@ -45,10 +45,14 @@ export const load: LayoutServerLoad = async ({ cookies, url, fetch }) => {
// No bloquear el dashboard si falla la carga de tenants
}
// Obtener la compañía activa de la cookie para persistencia
const activeCompanyId = cookies.get('active_company_id');
return {
authenticated: true,
user: { ...userData, token: accessToken },
companies,
activeCompanyId: activeCompanyId ? parseInt(activeCompanyId) : undefined,
userTenants,
error: undefined
};

View File

@@ -96,7 +96,7 @@
// ── Inicializar compañías ─────────────────────────────────────────────
if (data.companies) {
companyStore.initialize(data.companies);
companyStore.initialize(data.companies, data.activeCompanyId);
}
// ── Escuchar cambios de compañía y recargar datos ─────────────────────