Auditoría iniciada desde las capturas reales que mandaste (Google Calendar, Invitá amigos, 2FA, Comunidad, banner de conexión, Home, ZyChat) + barrido del resto de la app buscando el mismo tipo de bugs.
01Comunidad apuntaba a un dominio muerto
Corregidocommunity.zymplo.com → ERR_NAME_NOT_RESOLVED (Discourse nunca se desplegó).'https://community.zymplo.com' 'https://whatsapp.com/channel/0029VbCtZKuJENy6259hMk2Y'
02Botón de cámara en ZyChat abría la galería
CorregidoonPress={'{onPickImage}'} en vez de onOpenCamera (que ya existía y funcionaba bien detrás del botón "+").onPress={onPickImage} // abre galería onPress={onOpenCamera} // abre cámara nativa
03Tab "IA" con ícono genérico → "ZyChat" con isotipo real
CorregidoZymploMark, mismo componente del header del chat) + label "ZyChat" (pt/es/en). Mismo fix en el empty-state del chat.04Banner falso "Sin conexión a internet"
Corregidoprobe() (mount + evento NetInfo ambiguo + interval) podían correr en paralelo y sumar 2 "fallos" de un solo instante de lentitud, cruzando el umbral sin que hubiera 2 fallos reales separados en el tiempo.const probe = async () => {
if (inFlight.current) return; // guard de concurrencia
inFlight.current = true;
try { ... } finally { inFlight.current = false; }
}
05Home: nombre duplicado + pills solapadas
Corregidoempresa.nome) renderizado 2 veces; contenedor de texto sin flexShrink; fila de pills sin flexWrap.{empresa?.segmento ? <Text>{empresa.nome}</Text> : null} {empresa?.segmento && empresa.nome !== greetingName ? <Text>{empresa.nome}</Text> : null} greetingTextWrap: { flex: 1, minWidth: 0 } headerPills: { flexWrap: 'wrap', maxWidth: '58%' }
06"Mi negocio": columnas pegadas ("GASTOSA COBRAR")
CorregidoflexWrap empaquetaba por ancho de contenido, no por columna — nunca era un grid 2×2 real.<View style={{ width: '50%', ... }}> // fuerza 2 columnas exactas
07"Copiar link" en recibos compartía una URL que nunca existió
Corregidozymplo.app/receipt/:id — 404 garantizado, no hay ninguna página web así en ningún repo.08"Invitá amigos": código y botones muertos
Corregido (parcial — ver bloque naranja abajo)(s as any).token, un campo inexistente (el real es firebaseToken) → nunca mandaba el header de autorización → 401 silencioso (sin chequear response.ok).const token = useAuthStore((s) => (s as any).token) ?? ''; const token = useAuthStore((s) => s.firebaseToken) ?? ''; if (!r.ok) throw new Error(`http_${r.status}`); // antes: silencio total // + estado de error visible con botón "Intentar de nuevo"
09Mismo bug de campo, repetido en 6 pantallas más
CorregidoDailyScratchCard, wheel, leaderboard, privacy (exportar/borrar datos LGPD), audit-log, shop — todos con (s as any).user?.id ?? 1: si el bug no se disparaba silencioso, atribuía todo al usuario 1 fijo para cualquiera.const userId = useAuthStore((s) => (s as any).user?.id) ?? 1; const userId = useAuthStore((s) => s.userId); // campo real, sin default falso
Se investigó cada uno hasta la raíz real. En estos casos el problema no está en el código del celular — es un endpoint que nunca se construyó del lado del servidor, o un dato que el servidor todavía no expone. Parchear la app para que "parezca" funcionar sin el backend sería mentirle a la pantalla, así que en vez de eso: se dejó un estado honesto ("en preparación") donde antes había un error crudo, y acá abajo está el detalle técnico exacto de qué falta construir.
/v1/auth/2fa/*) están 100% implementados del lado de la app, 0% en el backend — confirmado con búsqueda cruzada en todo zymplo-api. La pantalla ahora falla rápido y muestra "estamos preparando esta protección" en vez de spinner largo + "HTTP 404" crudo.
zymplo-api/.../mobile-api/referrals.routes.ts) pero exige un token distinto al que usa el login normal (ligado al WhatsApp del usuario, no a Oracle). Para conectar ambos hace falta un endpoint puente + un handler de Oracle que hoy no existe (empr_codi → teléfono, marcado TODO DBA en el código desde antes).
Arreglé 9 de los 12 problemas que mandaste en las fotos, de raíz, y los probé con robots automáticos (no a ojo). Los otros 3 (2FA, invitar amigos del todo, y algunas pantallas de premios) no se pueden arreglar solo en el celular — les falta una parte en la computadora central de Zymplo que nunca se construyó. En vez de dejarlos rotos con mensajes feos, ahora dicen "esto lo estamos preparando" de forma prolija.
develop, no a main (así es la regla del equipo).