Skip to main content

Descripción

El módulo Stays gestiona las estadías del usuario organizadas por estado. Incluye filtrado, visualización por categoría, modales de acciones (cancelar, modificar, reseñar) y auto-prompt de reseñas al completar una estadía.
  • Ubicación: src/modules/stays/
Los usuarios visitantes ven StayGuestScreen en lugar de los Material Top Tabs. Los propietarios (coowners) ven las 4 pestañas deslizables: activas, pasadas, canceladas y pendientes.

Screens

API Endpoints

Cada endpoint acepta los parámetros status (active, past, cancelled), page y limit. No hay scroll infinito: se pide una única página grande (limit=100) por estado. my-rents y my-exchanges solo aceptan active y past (no cancelled).
La API v2 retorna objetos BookingV2 paginados que staysApi transforma a Booking mediante mapBookingV2ToBooking (src/modules/booking/utils/bookingMapper.ts), pasando el status y el id del usuario actual para resolver el rol y normalizar la propiedad.

Hooks

Tipos principales

Temporadas

Las estadías se clasifican por temporada: peak, high, mid y low (con variantes ski/beach según la ubicación de la propiedad). Cada temporada tiene colores y traducciones asociadas definidas en las constantes SEASONS.

Store

El módulo utiliza useReviewQueueStore en Zustand para gestionar la cola de reseñas pendientes:
  • populateQueue(stays, getCheckOut) — Llena la cola con estadías que requieren reseña. Solo se ejecuta una vez por sesión. - showNextReview() — Avanza al siguiente item de la cola. - dismissCurrentReview() — Descarta la reseña actual y avanza a la siguiente. - completeCurrentReview() — Marca como completada y avanza. - reset() — Reinicia la cola y permite reprocesar en la siguiente sesión.

StayCard Label System (v2)

El sistema de labels de la StayCard usa un modelo de 5 StayRoles con dos mensajes por tarjeta: un top message (texto contextual de acción) y un badge (indicador de approval).

StayRoles

La función getStayRole(stay) en src/modules/stays/utils/stayCardMessages.ts detecta el rol:

Badge Variants

Reglas de normalización

  • free y pending siempre producen el mismo texto (“Pendiente”) — spec regla 7
  • cancelled status siempre produce el mismo badge (“Cancelada/o”) independiente del approval
  • swapped solo aplica a type=exchange
  • Los guests por sí solos no distinguen dirección: una semana propia ya alquilada/intercambiada llega con los guests del solicitante. Solo es OWNER_RESERVED (solicitud enviada por el usuario) cuando él figura entre los asistentes (isUserAttending), que mapBookingV2ToBooking deriva buscando al usuario actual en stay.guests. En caso contrario se trata como OWNER_PUBLISHED.

Matriz completa de labels (ES)

OWNER_BOOK — Coowner reservó su casa (role=coowner, type=book)

OWNER_RESERVED — Coowner reservó rent/exchange con guests (role=coowner, type=rent|exchange, con guests)

type=rent type=exchange

OWNER_PUBLISHED — Coowner publicó su casa (role=coowner, type=rent|exchange, sin guests)

type=rent type=exchange

INVITED_GUEST — Invitado a estancia (role=guest)

EXTERNAL_VISITOR — Cliente externo (role=visitor)

type=rent type=exchange

Archivos clave

  • src/modules/stays/utils/stayCardMessages.ts — lógica de detección de StayRole y resolución de mensajes
  • src/modules/stays/components/StayCard.tsx — componente que renderiza top message + badge
  • src/core/i18n/languages/es.ts — claves stayScreen.stayCard.*
  • src/core/i18n/languages/en.ts — claves equivalentes en inglés

Componentes destacados

StayCard

Tarjeta de estadía con información de fechas, propiedad y estado. Incluye indicador visual de temporada.

StayList

Listado de estadías con soporte para skeletons de carga y estado vacío.

StayDetailsView

Vista de detalle de una estadía con información completa y panel de acciones.

SeasonsDisplay

Visualización de temporadas con colores y conteo de estadías disponibles por categoría.

StayActionsPanel

Panel de acciones contextuales: cancelar, modificar y gestionar invitados.

AutoShowReviewModal

Modal que se muestra automáticamente al completar una estadía. Embebe SurveyScreen del modulo Surveys con slug="stay-review" y onClose callback. Utiliza useReviewQueueStore para gestionar múltiples reseñas pendientes.

Modales

Tras confirmar una cancelación, StayCancelModal navega con router.replace a /(tabs)/04_stays?cancelled=true (en vez de push) para no dejar el detalle de una estadía ya cancelada en el stack. Además, si se abre el detalle de una estadía inexistente (error NOT_FOUND), StayDetailsScreen redirige automáticamente a /(tabs)/04_stays/active en lugar de mostrar una pantalla de error.

Reseñas de estadía

Las reseñas de estadía usan el motor genérico de encuestas del módulo Surveys con slug="stay-review" y scopeType="booking". El flujo tiene dos entry points:
  • StayCard: El botón “Dar tu opinión” en estancias pasadas navega a /booking/review?bookingId={id}, que renderiza SurveyScreen.
  • AutoShowReviewModal: Se muestra automáticamente tras el checkout. Embebe SurveyScreen dentro de un <Modal> con onClose callback para avanzar en la cola de reseñas.
Las reseñas de estadía se gestionan a través del módulo Surveys (endpoint /surveys/mobile/stay-review), no a través de endpoints custom del módulo Property. El módulo Stays gestiona la UX y la cola de reseñas.