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 ensrc/core/featureFlags/flags.ts y se resuelven en tiempo de ejecución vía PostHog.
Hooks
useIsBetaTester
betaTesterUsers y el payload de betaTesterHomes, y devuelve dos señales que no deben confundirse:
isBetaTester— identidad de cuenta: match por usuario o por casa. Global a la persona. Solo para consumidores account-level (useAnalyticsBetaSync,BetaTesterWelcomeCard).isBetaHome— la 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.
propertyId?: string | null decide el modo:
- Modo cuenta (
propertyIdomitido):matchesHomeestruesi el usuario posee alguna casa deallowPropertyIds(se cruza conusePropertyStore().ownedPropertiesList).isBetaHomeesfalse: sin casa en scope no hay nada que condicionar. - Modo por propiedad (
propertyIdprovisto, admitenull):matchesHomeestruesolo si esa propiedad está enallowPropertyIds, con independencia de la propiedad de la casa. Ya no consultaownedPropertiesList. UnpropertyIdanull(nada seleccionado) nunca hace match: fail-open a las vistas normales.
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
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
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.