Screen · Dispositivos y sesiones

Dispositivos y sesiones activas

Pantalla interior desde Seguridad de la cuenta (A13, ruta /profile/security/sessions). Lista de sesiones con ícono por plataforma, ubicación aproximada y última actividad. La sesión actual va marcada y no es revocable desde su fila. Acciones: revocar individual (confirm sheet) y Cerrar todas las demás sesiones. Estado vacío: "Solo esta sesión".

/profile/security/sessions GET · DELETE /v1/me/sessions sesión actual protegida ubicación aproximada por IP
Layout anotado · con sesiones

Lista hairline (canvas-first, sin cards por fila). La sesión actual siempre arriba, con pill ESTE DISPOSITIVO y sin acción de revocar. La acción destructiva global va al final, outlined destructive.

sesión actual · sin revocar
revocar individual → sheet
destructive outlined
nota de retención
9:41
Dispositivos y sesiones
Pixel 8Este dispositivo
Villavicencio · activa ahora
iPhone 14
Bogotá · hoy 8:52
Chrome · Windows
Bogotá · ayer 22:14
Safari · macOS
Medellín · 28 jun · 19:03
Cerrar todas las demás sesiones
La ubicación es aproximada, según la red de conexión. Si no reconoces un dispositivo, ciérralo y cambia tu clave.

Composición

  1. Fila de sesiónGrid 40dp · 1fr · auto como tx-list. Ícono por plataforma: smartphone (Android/iOS), monitor (web desktop), tablet. Título = modelo o navegador·SO.
  2. Sesión actual · protegidaSiempre primera, pill ESTE DISPOSITIVO, chip teal y sin ✕: no se puede revocar desde la fila. Cerrarla = cerrar sesión, y vive en Perfil, no aquí.
  3. Metadatos honestosCiudad aproximada por IP + última actividad (relativa hoy/ayer, absoluta después — patrón timestamps del centro de notificaciones). Nunca coordenadas exactas.
  4. Revocar individualEl ✕ (target 40dp) abre el confirm sheet — acción sensible, nunca revoca al primer tap.
  5. Cerrar todas las demásBotón destructive outlined al final de la lista. Solo visible con ≥2 sesiones. También pide confirmación en sheet.
Estados · confirmación, vacío, cargando

La revocación usa patterns-confirmation-sheet con botón destructive. El estado vacío no es un error — es la situación deseable: "Solo esta sesión".

Confirm sheet · revocar
9:41
Dispositivos y sesiones
Pixel 8Este dispositivo
Villavicencio · activa ahora
iPhone 14
Bogotá · hoy 8:52

¿Cerrar esta sesión?

El dispositivo tendrá que iniciar sesión de nuevo para entrar a tu cuenta.

iPhone 14
Bogotá · hoy 8:52
Cerrar sesión
Cancelar
Vacío · solo esta sesión
9:41
Dispositivos y sesiones
Pixel 8Este dispositivo
Villavicencio · activa ahora
Solo esta sesión
Tu cuenta no está abierta en ningún otro dispositivo.
Cargando
9:41
Dispositivos y sesiones

Reglas de estado

  1. Confirm sheetReuso de patterns-confirmation-sheet: título pregunta, consecuencia en una línea, fila del dispositivo objetivo, CTA destructive + Cancelar ghost. Revocación optimista con undo no — es seguridad: se ejecuta y se confirma.
  2. Vacío ≠ errorLa sesión actual siempre se muestra; el vacío aplica al resto. Ícono shield-check — tono positivo, sin CTA.
  3. Error / offlinePatrón estándar: cloud-off + "Reintentar" outlined (error), banner neutro + lista cacheada de solo lectura (offline).
  4. Tras revocar todasLa lista colapsa al estado vacío con transición fade 200ms; notificación de seguridad a los dispositivos revocados.
Dark · 360dp
Dark · con sesiones
9:41
Dispositivos y sesiones
Pixel 8Este dispositivo
Villavicencio · activa ahora
iPhone 14
Bogotá · hoy 8:52
Chrome · Windows
Bogotá · ayer 22:14
Cerrar todas las demás sesiones
La ubicación es aproximada, según la red de conexión. Si no reconoces un dispositivo, ciérralo y cambia tu clave.
Notas de implementación · Flutter

Sesiones · listado y revocación

Endpoints

GET /v1/me/sessions → lista con {id, platform, model, city, last_active_at, is_current}. DELETE /v1/me/sessions/{id} individual · DELETE /v1/me/sessions?others=true para el barrido.

Sesión actual

is_current se resuelve por token — la fila propia se renderiza sin acción y el backend rechaza (409) cualquier DELETE sobre ella. Doble protección UI + API.

Orden y agrupación

Actual primero, luego por last_active_at desc. Sin paginación en MVP (límite ~10 sesiones por cuenta).

Ícono por plataforma

platform enum → smartphone / monitor / tablet. El modelo viene del registro de dispositivo hecho en el login (A2).

Revocación

DELETE → invalida refresh token server-side; el dispositivo cae al próximo request. La fila sale con fade+collapse 200ms tras 200 OK — sin optimismo: seguridad se confirma, no se asume.

Notificación

Revocar dispara push silenciosa de cierre + notificación "Tu sesión se cerró desde otro dispositivo" (canal seguridad).