| Campo | Valor |
|---|---|
| Estado | Aceptado |
| Fecha | 2026-05-21 |
| Contexto | UMS Web App — Estrategia de Gestión de Estado |
| Decisores | Equipo de Arquitectura |
Las aplicaciones React necesitan gestionar dos tipos fundamentalmente diferentes de estado:
Usar una única solución para ambos lleva a over-engineering (estado de servidor en Redux) o under-engineering (estado de cliente con lógica de fetch manual).
Usar un enfoque de estrategia dual:
// Las queries son cacheadas, deduplicadas, y auto-invalidadas
const { data, isLoading } = useQuery({
queryKey: ['tenants', page, filters],
queryFn: () => tenantService.getTenants(page, filters),
staleTime: 30_000,
});
// Las mutaciones invalidan queries y muestran notificaciones
const createMutation = useNotifiedMutation({
mutationFn: (data) => tenantService.createTenant(data),
invalidateKeys: [['tenants']],
successNotif: () => ({ title: 'Created', message: 'Tenant created' }),
errorNotif: (err) => ({ title: 'Error', message: getHttpErrorMessage(err) }),
});
// Gestión de estado simple, rápida, TypeScript-first
export const useThemeStore = create<ThemeState>()(
persist(
(set) => ({
isDarkMode: true,
toggleDarkMode: () => set((s) => ({ isDarkMode: !s.isDarkMode })),
}),
{ name: 'ums-theme' },
),
);
| Store | Propósito | Persistencia |
|---|---|---|
auth.store |
Sesión de usuario, estado de autenticación | No (solo sesión) |
theme.store |
Preferencia de modo oscuro/claro | Sí (localStorage) |
notification.store |
Notificaciones in-app (cap: 50) | No (solo sesión) |
i18n.store |
Idioma activo (en/es) |
No (sincroniza con document.lang) |
devTools.store |
Overrides solo-dev (suplantación de usuario) | No (solo dev) |
devTools.store es solo desarrollo; el código de producción usa i18n.store y auth.store.Todas las mutaciones siguen el mismo patrón vía useNotifiedMutation:
Positivas:
persist para localStorage sin código customuseNotifiedMutation elimina boilerplate de mutacionesNegativas:
persist)src/application/stores/ — Todos los stores de Zustandsrc/application/hooks/use-notified-mutation.ts — Factory de mutacionessrc/infrastructure/http/ — Clientes HTTP y GraphQLvitest.config.ts — Thresholds de coverage para código de estado