Skip to main content

Documentation Index

Fetch the complete documentation index at: https://wiki.vivla.com/llms.txt

Use this file to discover all available pages before exploring further.

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

ScreenRutaDescripción
ActiveStaysScreen/(tabs)/04_stays/activeEstadías activas o en curso
PastStaysScreen/(tabs)/04_stays/pastEstadías pasadas
CancelledStaysScreen/(tabs)/04_stays/cancelledEstadías canceladas
PendingStaysScreen/(tabs)/04_stays/pendingEstadías pendientes de aprobación
StayGuestScreen/(tabs)/04_staysVista para usuarios visitantes (sin pestañas)

API Endpoints

MétodoPathDescripción
GET/stays/mineTodas las estadías del usuario
GET/stays/mine?status=activeEstadías activas
GET/stays/mine?status=pastEstadías pasadas
GET/stays/mine?status=cancelledEstadías canceladas
La API retorna objetos Booking que son transformados internamente por staysApi para normalizar el campo property (el backend puede devolver home en lugar de property en ciertos casos).

Hooks

HookDescripción
useStays()Fetch y categorización de estadías por estado (active, past, cancelled)
useFilteredStays()Filtrado de estadías por criterios múltiples (propiedad, temporada, fechas)
useAutoShowReview()Muestra automáticamente el modal de reseña al completar una estadía

Services

ServicioDescripción
stayFilterServiceLógica de filtrado de estadías por criterios múltiples

Tipos principales

type Stay = {
  id: string;
  startDate: string;
  endDate: string;
  season: {
    slug: string;
    allowConsecutive: boolean;
  };
  allowLastHour?: boolean;
  available: boolean;
  keys?: number;
  instantKeys?: boolean;
  booking?: {
    id: string;
    type: 'book' | 'exchange' | 'rent';
  };
};

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.
TemporadaDescripción
peakTemporada alta (mayor demanda)
highTemporada alta intermedia
midTemporada media
lowTemporada baja

Store

El módulo utiliza useReviewQueueStore en Zustand para gestionar la cola de reseñas pendientes:
EstadoTipoDescripción
queueReviewQueueItem[]Cola de reseñas pendientes ordenadas por fecha de check-out
currentIndexnumberÍndice de la reseña actual en la cola
hasProcessedThisSessionbooleanIndica si ya se procesó la cola en la sesión actual
  • 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:
StayRoleCondiciónTop MessageBadge Gender
OWNER_BOOKrole=coowner && type=book— (sin top message)Femenino
OWNER_RESERVEDrole=coowner && (rent|exchange) && guests > 0Solicitud de alquiler/intercambioMasculino
OWNER_PUBLISHEDrole=coowner && (rent|exchange) && sin guestsPUBLICADA EN ALQUILER/INTERCAMBIO (uppercase)Femenino
INVITED_GUESTrole=guestHas sido invitado / Fuiste invitadoFemenino
EXTERNAL_VISITORrole=visitorSolicitud / texto descriptivo por approvalMasculino

Badge Variants

VarianteColorCondición
pendingAmarilloactive + free/pending
confirmedVerdeactive/past + approved/swapped
rejectedRojoactive/past + rejected
notConfirmedGrispast + free/pending
cancelledRojocancelled (cualquier approval)

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

Matriz completa de labels (ES)

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

StatusApprovalTop MessageBadge
activefreePendiente
activependingPendiente
activeapprovedConfirmada
activerejectedRechazada
pastfreeNo confirmada
pastpendingNo confirmada
pastapprovedConfirmada
pastrejectedRechazada
cancelledfreeCancelada
cancelledpendingCancelada
cancelledapprovedCancelada
cancelledrejectedCancelada

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

type=rent
StatusApprovalTop MessageBadge
activefreeSolicitud de alquilerPendiente
activependingSolicitud de alquilerPendiente
activeapprovedSolicitud de alquilerConfirmado
activerejectedSolicitud de alquilerRechazado
pastfreeSolicitaste un alquilerNo confirmado
pastpendingSolicitaste un alquilerNo confirmado
pastapprovedSolicitaste un alquilerConfirmado
pastrejectedSolicitaste un alquilerRechazado
cancelledfreeSolicitaste un alquilerCancelado
cancelledpendingSolicitaste un alquilerCancelado
cancelledapprovedSolicitaste un alquilerCancelado
cancelledrejectedSolicitaste un alquilerCancelado
type=exchange
StatusApprovalTop MessageBadge
activefreeSolicitud de intercambioPendiente
activependingSolicitud de intercambioPendiente
activeapprovedSolicitud de intercambioConfirmado
activerejectedSolicitud de intercambioRechazado
pastfreeSolicitaste un intercambioNo confirmado
pastpendingSolicitaste un intercambioNo confirmado
pastapprovedSolicitaste un intercambioConfirmado
pastrejectedSolicitaste un intercambioRechazado
cancelledfreeSolicitaste un intercambioCancelado
cancelledpendingSolicitaste un intercambioCancelado
cancelledapprovedSolicitaste un intercambioCancelado
cancelledrejectedSolicitaste un intercambioCancelado

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

type=rent
StatusApprovalTop MessageBadge
activefreePUBLICADA EN ALQUILERPendiente
activependingPUBLICADA EN ALQUILERPendiente
activeapprovedPUBLICADA EN ALQUILERAlquilada
activerejectedPUBLICADA EN ALQUILERRechazada
pastfreePUBLICADA EN ALQUILERNo confirmada
pastpendingPUBLICADA EN ALQUILERNo confirmada
pastapprovedPUBLICADA EN ALQUILERCompletada
pastrejectedPUBLICADA EN ALQUILERRechazada
cancelledfreePUBLICADA EN ALQUILERCancelada
cancelledpendingPUBLICADA EN ALQUILERCancelada
cancelledapprovedPUBLICADA EN ALQUILERCancelada
cancelledrejectedPUBLICADA EN ALQUILERCancelada
type=exchange
StatusApprovalTop MessageBadge
activefreePUBLICADA EN INTERCAMBIOPendiente
activependingPUBLICADA EN INTERCAMBIOPendiente
activeapprovedPUBLICADA EN INTERCAMBIOIntercambiada
activerejectedPUBLICADA EN INTERCAMBIORechazada
activeswappedPUBLICADA EN INTERCAMBIOConfirmada
pastfreePUBLICADA EN INTERCAMBIONo confirmada
pastpendingPUBLICADA EN INTERCAMBIONo confirmada
pastapprovedPUBLICADA EN INTERCAMBIOCompletada
pastrejectedPUBLICADA EN INTERCAMBIORechazada
pastswappedPUBLICADA EN INTERCAMBIOCompletada
cancelledfreePUBLICADA EN INTERCAMBIOCancelada
cancelledpendingPUBLICADA EN INTERCAMBIOCancelada
cancelledapprovedPUBLICADA EN INTERCAMBIOCancelada
cancelledrejectedPUBLICADA EN INTERCAMBIOCancelada
cancelledswappedPUBLICADA EN INTERCAMBIOCancelada

INVITED_GUEST — Invitado a estancia (role=guest)

StatusApprovalTop MessageBadge
activefreeHas sido invitado a una estanciaPendiente
activependingHas sido invitado a una estanciaPendiente
activeapprovedHas sido invitado a una estanciaConfirmada
activerejectedHas sido invitado a una estanciaRechazada
activeswappedHas sido invitado a una estanciaConfirmada
pastfreeFuiste invitado a esta estanciaNo confirmada
pastpendingFuiste invitado a esta estanciaNo confirmada
pastapprovedFuiste invitado a esta estanciaConfirmada
pastrejectedFuiste invitado a esta estanciaRechazada
pastswappedFuiste invitado a esta estanciaConfirmada
cancelledfreeFuiste invitado a esta estanciaCancelada
cancelledpendingFuiste invitado a esta estanciaCancelada
cancelledapprovedFuiste invitado a esta estanciaCancelada
cancelledrejectedFuiste invitado a esta estanciaCancelada
cancelledswappedFuiste invitado a esta estanciaCancelada

EXTERNAL_VISITOR — Cliente externo (role=visitor)

type=rent
StatusApprovalTop MessageBadge
activefreeSolicitud de alquilerPendiente
activependingSolicitud de alquilerPendiente
activeapprovedSolicitud de alquilerConfirmado
activerejectedSolicitud de alquilerRechazado
pastfreeAlquilaste esta casaNo confirmado
pastpendingTu alquiler quedó sin confirmarNo confirmado
pastapprovedAlquilaste esta casaConfirmado
pastrejectedTu alquiler fue rechazadoRechazado
cancelledfreeAlquiler canceladoCancelado
cancelledpendingSolicitud de alquiler canceladaCancelado
cancelledapprovedAlquiler canceladoCancelado
cancelledrejectedAlquiler rechazadoCancelado
type=exchange
StatusApprovalTop MessageBadge
activefreeSolicitud de intercambioPendiente
activependingSolicitud de intercambioPendiente
activeapprovedSolicitud de intercambioConfirmado
activerejectedSolicitud de intercambioRechazado
activeswappedSolicitud de intercambioConfirmado
pastfreeIntercambiaste esta casaNo confirmado
pastpendingTu intercambio quedó sin confirmarNo confirmado
pastapprovedIntercambiaste esta casaConfirmado
pastrejectedTu intercambio fue rechazadoRechazado
pastswappedIntercambiaste esta casaConfirmado
cancelledfreeIntercambio canceladoCancelado
cancelledpendingSolicitud de intercambio canceladaCancelado
cancelledapprovedIntercambio canceladoCancelado
cancelledrejectedIntercambio rechazadoCancelado
cancelledswappedIntercambio canceladoCancelado

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

ModalDescripción
AutoShowReviewModalPrompt automático de reseña post-estadía. Embebe SurveyScreen slug="stay-review" en un <Modal>
StayCancelModalConfirmación de cancelación de estadía
StayModifyModalModificación de fechas de estadía

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.