Skip to main content

Descripción

Ubicación: src/modules/beta-tester/ Habilita el “modo beta tester”, que da acceso anticipado a funcionalidades en desarrollo (alquiler e intercambio de casas) a un conjunto controlado de usuarios y propiedades. Se activa mediante feature flags de PostHog, sin necesidad de publicar una nueva versión de la app.
Este módulo no expone pantallas propias. Provee hooks y componentes que otros módulos (home, booking, stays, property) consumen para adaptar su UI y sus endpoints según el estado de beta tester.

Feature flags

Los flags se definen en src/core/featureFlags/flags.ts y se resuelven en tiempo de ejecución vía PostHog.
El flag de usuarios (beta-tester-users) nunca debe condicionar alquiler ni intercambio. Si lo hiciera, dar de alta a un copropietario en el programa le bloquearía esos canales en todas sus casas, reales incluidas, mientras los flags de disponibilidad estén al 0%. El gating keyea siempre en la casa en scope (isBetaHome).

Hooks

useIsBetaTester

Lee el flag betaTesterUsers y el payload de betaTesterHomes, y devuelve dos señales que no deben confundirse:
  • isBetaTesteridentidad de cuenta: match por usuario o por casa. Global a la persona. Solo para consumidores account-level (useAnalyticsBetaSync, BetaTesterWelcomeCard).
  • isBetaHomela casa en scope es una casa beta. Es la única señal que puede condicionar comportamiento (alquiler / intercambio), para que una casa real nunca cambie de comportamiento por el hecho de que su propietario entre en el programa.
El parámetro opcional propertyId?: string | null decide el modo:
  • Modo cuenta (propertyId omitido): matchesHome es true si el usuario posee alguna casa de allowPropertyIds (se cruza con usePropertyStore().ownedPropertiesList). isBetaHome es false: sin casa en scope no hay nada que condicionar.
  • Modo por propiedad (propertyId provisto, admite null): matchesHome es true solo si esa propiedad está en allowPropertyIds, con independencia de la propiedad de la casa. Ya no consulta ownedPropertiesList. Un propertyId a null (nada seleccionado) nunca hace match: fail-open a las vistas normales.
El match por usuario (matchesUser) es global en ambos modos, pero no entra en isBetaHome.

useBetaTesterRentAvailable / useBetaTesterExchangeAvailable

Ambos hooks comparten la misma forma de retorno y keyean en isBetaHome, nunca en isBetaTester. En una casa que no sea beta el canal está siempre habilitado y su comportamiento no se altera, sea quien sea el usuario. Ambos aceptan el mismo propertyId?: string | null opcional y lo reenvían a useIsBetaTester; omitirlo hace fail-open.
useTestEndpoint se pasa a useExchangePropertiesQuery / useRentalPropertiesQuery en useProperties.ts para que los beta testers consulten los datos de prueba en lugar de los de producción.

useAnalyticsBetaSync

Sincroniza las propiedades beta_tester, beta_tester_match y beta_tester_home_ids al perfil de analytics. Ignora a visitantes y a usuarios no autenticados, y usa una firma (signature) para evitar reenvíos cuando el estado no cambia.

Componentes

BetaTesterWelcomeCard

Tarjeta de bienvenida que solo se renderiza para beta testers (useIsBetaTester). Se muestra en el hero de la home (HomePropertyHero).

BetaTesterListingsPlaceholder

Placeholder “Próximamente” con listados falsos difuminados. Recibe channel: 'rent' | 'exchange' y se usa en RentScreen y ExchangeScreen.

BetaTesterBookingChoicePlaceholder

Placeholder para la elección de tipo de reserva. Acepta variant: 'card' | 'inline' y se usa en BookingTypeForm y en StayModifyModal.

Consumidores

El estado de beta tester depende de datos que se hidratan de forma asíncrona en propertyStore. En modo cuenta, el match por casa (matchesHome) devolverá false hasta que ownedPropertiesList esté disponible. En modo por propiedad, el gating keyea en selectedPropertyId: mientras sea null (nada seleccionado todavía) isBetaHome es false, es decir, se hace fail-open a las vistas normales hasta que el selector de la home fije la casa.
Al añadir un consumidor nuevo, pásale siempre la casa en scope. Un hook de gating sin propertyId hace fail-open a propósito: es preferible dejar un canal abierto que bloquear el alquiler o el intercambio de una casa real que no hemos sabido identificar.